2017 11-10 Mysql應用2

一.mysql的日志應用

(1)查詢日志:general_log

記錄查詢語句,日志存儲位置:
文件:file
表:table (mysql.general_log)
general_log={ON|OFF}
general_log_file=HOSTNAME.log
log_output={FILE|TABLE|NONE}

  • desc general_log;——查看日志


    搜狗截圖20171110213009.png
  • 默認情況下日志為關閉狀態,需要手動開啟


    搜狗截圖20171110213223.png

    *手動開啟日志功能


    搜狗截圖20171110213339.png

    注意:開啟日志功能要在在global中設置
  • 在默認情況下,修改表后內容會存在文件類型的日志中
    手動進行修改莫數據庫中的表內容來進行驗證


    搜狗截圖20171110213918.png

    搜狗截圖20171110213533.png

    cd /var/lib/mysql/
    cat node1.log


    搜狗截圖 20171110214753.png
  • 通過手動設置將日志存儲為改為table


    搜狗截圖20171110213757.png

    修改完成后,再次在數據庫中執行命令時,內容就會存儲在table中

  • 修改成功后再執行一些命令來查看


    搜狗截圖20171110215624.png

(2).慢查詢日志:log_slow_queries

慢查詢:運行時間超出指定時長的查詢;
long_query_time


搜狗截圖20171110220111.png

存儲位置:
文件:FILE
表:TABLE,mysql.slog_log


搜狗截圖20171110220301.png

log_slow_queries={ON|OFF}——set @@global.slow_query_log=ON
搜狗截圖20171110220350.png

slow_query_log={ON|OFF}—— set @@global.log_slow_queries=ON;

注意:為了穩妥起見,要將slow_query_log和log_slow_queries都開啟,他們功能類似,根據不同的數據庫類型而設置成不同格式,所以在執行操作之前要將這兩種方式都開啟


搜狗截圖20171110221420.png

(3).錯誤日志:log_error, log_warnings

記錄如下幾類信息:
1.mysqld啟動和關閉過程中輸出的信息;
2.mysqld運行中產生的錯誤信息;
3.event scheduler運行時產生的信息;
4.主從復制架構中,從服務器復制線程啟動時產生的日志;
log_error=/var/log/mariadb/mariadb.log|OFF——開啟錯誤日志不用寫on而是直接寫錯誤日志文件路徑就是開啟,關閉的話執行set @@global.log_error=OFF
默認情況下錯誤日志是開啟的


搜狗截圖20171110222302.png

查看錯誤日志內容


搜狗截圖20171110222354.png

log_warnings={ON|OFF}

(4).二進制日志:binlog

1.概念:用于記錄引起數據改變或存在引起數據改變的潛在可能性的語句(STATEMENT)或改變后的結果(ROW),也可能是二者混合;
功用:“重放”
2.查看二進制日志格式
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句;
ROW:行;
MIXED:混編;


搜狗截圖20171110223122.png

查看二進制日志文件列表:
SHOW MASTER|BINARY LOGS;


搜狗截圖20171110223838.png

查看當前正在使用的二進制日志文件:
SHOW MASTER STATUS;
搜狗截圖20171110223953.png

查看二進制 日志文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
搜狗截圖20171110224519.png

在數據庫中做一些操作,然后查看二進制日志內容
例:

use hellodb;
delete from students where id=23;
執行完后查看二進制日志


搜狗截圖20171110225014.png

也可以挑選內容進行查看
搜狗截圖20171110225210.png

當關閉二進制日志后,再執行的后續操作將不會出現在二進制文件中
退出mysql=數據庫后,創建mkdir -pv /mydata/{logs,data}
然后 vim /etc/my.cnf.cd/server.cnf
搜狗截圖20171110225820.png

cd /mydata/logs
搜狗截圖20171110225914.png

注意不能直接用cat命令進行查看,因為生成的日志文件都是二進制格式的
  • 查看二進制格式日志的方法
    mysqlbinlog master-log.000002


    搜狗截圖20171111090825.png

    更多的使用方法可以采用man mysqlbinlog來進行查看
    例:可以直接跳過多少行來查看
    mysqlbinlog -j 316 master-log.000002


    搜狗截圖20171111091348.png

    可以從第幾行開始,到多少行結束的方式來查看
    mysqlbinlog -j 316 --stop-position 414 master-log.000002
    也可根據日志的時間來查看

    mysqlbinlog --start-datetime="2017-11-10 20:39:16" master-log.000002


    搜狗截圖20171111091812.png

    服務器變量:
    log_bin=/PATH/TO/BIN_LOG_FILE
    只讀變量;
    session.sql_log_bin={ON|OFF}
    控制某會話中的“寫”操作語句是否會被記錄于日志文件中;
    max_binlog_size=1073741824——設置二進制日志存儲內容的大小
    sync_binlog={1|0}——是否同步二進制日志
    以上內容如果想永久保存就要寫入配置文件中,否則重啟就會消失

(5).中繼日志:relay_log

從服務器上記錄下來從主服務器的二進制日志文件同步過來的事件;

(6).事務日志:innodb_log

事務型存儲引擎innodb用于保證事務特性的日志文件:
redo log
undo log

二.備份和恢復(數據)

(1)備份:存儲的數據副本;
原始數據:持續改變;
(2)恢復:把副本應用到線上系統;
僅能恢復至備份操作時刻的數據狀態;
時間點恢復:
binary logs;
(3)為什么備份?
災難恢復:硬件故障(冗余)、軟件故障(bug)、自然災害、黑客攻擊、誤操作、...
測試;
(4)備份時應該注意事項
能容忍最多丟失多少數據;
恢復數據需要在多長時間內完成;
需要恢復哪些數據;
(5)備份類型
備份的數據集的范圍:
完全備份和部分備份
完全備份:整個數據集
部分備份:數據集的一部分,比如部分表;

  • 全量備份:完全備份,如果備份數據較大不建議經常使用完全備份,備份的策略可設定為一星期一次或是一個月一次,因為每備份一次會消耗很長時間和資源
  • 增量備份:僅備份自上一次完全備份或增量備份以來變量的那部數據;
  • 差異備份:僅備份自上一次完全備份以來變量的那部數據;
  • 物理備份:復制數據文件進行的備份;
  • 邏輯備份:從數據庫導出數據另存在一個或多個文件中;
    根據數據服務是否在線:
    熱備:讀寫操作均可進行的狀態下所做的備份;
    溫備:可讀但不可寫狀態下進行的備份;
    冷備:讀寫操作均不可進行的狀態下所做的備份;
    (6)備份需要考慮因素
    鎖定資源多長時間?
    備份過程的時長?
    備份時的服務器負載?
    恢復過程的時長?
    (7)備份策略
    全量+差異 + binlogs
    全量+增量 + binlogs
    備份手段:物理、邏輯
    備份的是數據
    二進制日志、InnoDB的事務日志;
    代碼(存儲過程、存儲函數、觸發器、事件調度器)
    服務器的配置文件
    (8)備份工具
    mysqldump:mysql服務自帶的備份工具;邏輯備份工具;
    完全、部分備份;
    InnoDB:熱備;
    MyISAM:溫備;
    cp/tar
    lvm2:快照(請求一個全局鎖),之后立即釋放鎖,達到幾乎熱備的效果;物理備份;
    注意:不能僅備份數據文件;要同時備份事務日志;
    前提:要求數據文件和事務日志位于同一個邏輯卷;
    xtrabackup:
    由Percona提供,開源工具,支持對InnoDB做熱備,物理備份工具;
    完全備份、部分備份;
    完全備份、增量備份;
    完全備份、差異備份;
    mysqlhotcopy
    select:
    備份:SELECT cluase INTO OUTFILE 'FILENAME';
    恢復:CREATE TABLE
    導入:LOAD DATA
    InnoBase:Innodb --> XtraDB, Innobackup --> Xtrabackup
    (9)備份策略:
    xtrabackup:
    全量+差異+binlog
    全量+增量+binlog
    mysqldump:
    全量+binlog
    mysqldump:
    邏輯備份工具:基于mysql客戶端協議
    完全備份、部分備份;
    InnoDB:熱備或溫備;
    MyISAM:溫備;
    二次封裝工具:
    mydumper
    phpMyAdmin
    Usage:
    mysqldump [OPTIONS] database [tables] # 備份單庫,可以只備份其中的一部分表(部分備份);
    OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] # 備份多庫;
    OR mysqldump [OPTIONS] --all-databases [OPTIONS] # 備份所有庫;


    搜狗截圖20171111113716.png

    搜狗截圖20171111114026.png

    MyISAM存儲引擎:支持溫備,備份時要鎖定表;
    -x, --lock-all-tables:鎖定所有庫的所有表,讀鎖;
    -l, --lock-tables:鎖定指定庫所有表;
    InnoDB存儲引擎:支持溫備和熱備;
    --single-transaction:創建一個事務,基于此快照執行備份;
    其它選項:
    -R, --routines:備份指定庫的存儲過程和存儲函數;
    --triggers:備份指定庫的觸發器;
    -E, --events:
    --master-data[=#]
    1:記錄為CHANGE MASTER TO語句,此語句不被注釋;=1
    2:記錄為CHANGE MASTER TO語句,此語句被注釋;=2
    --flush-logs:鎖定表完成后,即進行日志刷新操作;

實驗:通過一些演示來加深印象

1.首先在另一個節點主機上執行
mysqldump -uroot -h172.18.254.242 -pmagedu --single-transaction -R --triggers -E --databases hellodb > /root/hellodb.sql
將主服務器數據庫此時的操作內容存儲到本地中并命名為hellodb.sql
2.將主數據庫中的內容導入另一個數據庫中
mysql -uroot -hlocalhost < hellodb.sql
開啟mysql后發現主數據庫上的hellodb數據庫的內容導入了本數據庫中


搜狗截圖20171111115104.png

3.加入刷新日志功能,并重新儲存到一個新的以時間格式定義的文件中
mysqldump -uroot -h172.18.254.242 -pmagedu --single-transaction -R --triggers -E --databases hellodb --master-data=2 --flush-logs > /root/hellodb-$(date +%F-%H-%M-%S).sql


搜狗截圖20171111115510.png

4.關閉遠程服務器數據庫
systemctl stop mariadb
rm -rf /var/lib/mysql/*
systecmtl start mariadb
開啟mysql
搜狗截圖20171111143444.png

5.恢復數據

mysql </root/ hellodb-2017-11-12-10-58-36.sql


搜狗截圖20171111143919.png

注意:如果此時在主數據庫中執行新的操作,那么遠程服務器的數據庫上將不會顯示新的操作內容,如果想顯示最新的操作內容應該將主服務器的二進制日志傳送到遠程服務器上,然后將二進制日志文件導入mysql數據庫中再查看,主服務的數據庫的二進制日志一定要先開啟
搜狗截圖20171111145918.png
搜狗截圖20171111150035.png

搜狗截圖20171111150419.png

在遠程數據庫上首先systemctl stop mariadb
rm -rf /var/lib/mysql/*
systemctl start mariadb
開啟mysql后之前導入的數據都被清空
此時執行mysql </root/hellodb-2017-11-12-14-49-51.sql
再次開啟后不能看見新執行的內容
解決辦法是在主服務器上將生成的二進制日志文件scp到遠程
mysqlbinlog master-log.000007 > /tmp/binlog.sql
scp /tmp/binlog.sql 172.18.25.62:/root/
數據庫上,然后在遠程數據庫上執行mysql </binlog.sql
再次開啟mysql后可以看見新更新的內容
搜狗截圖20171111152222.png

(10)xtrabackup

該軟件屬于percona開發,官網:www.percona.com
實現全量+差異+binlog ,全量+增量+binlog
1.安裝percona——官網下載,或是在ftp上下載
percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
針對innodb支持熱備份增量,而myisam支持溫備全量
2.備份的實現
在主數據庫上創建一個目錄 mkdir /mydata/backups
innobackupex --user=root --password=magedu --host=localhost /mydata/backups/——進行備份到指定目錄里
cd /mydata/backups
cd 2017-11-11_16-32-51/

搜狗截圖20171111171432.png

3.在主數據上進行一些修改,修改完后做增量備份
innobackupex --user=root --password=magedu --host=localhost --incremental /mydata/backups/ --incremental-basedir=/mydata/backups/2017-11-11_16-32-51——建立第一個增量備份
搜狗截圖20171111172234.png

然后建立第二個增量,還是先在主數據庫上做一些修改
再執行innobackupex --user=root --password=magedu --host=localhost --incremental /mydata/backups/ --incremental-basedir=/mydata/backups/2017-11-11_16-38-00
搜狗截圖20171111172549.png

但是在此時我們要考慮這么一種情況那就是如果還未來的及做增量備份時服務就崩潰了,那么我們就要在最新的二進制日志中保存下來
步驟:cd /mydata/backups/2017-11-11_16-41-24
搜狗截圖20171111174020.png

mysqlbinlog -j 667 /mydata/logs/master-log.000007 > /root/mybinlog.sql
此時設置全量加增量方式備份完畢,如果要將備份文件傳到遠程主機上還要在本機上執行prepare操作,即先在本機上將增量合成一個完整的全量再傳到遠程主機上去
具體過程:
(1)先將遠程服務器數據庫關閉并rm -rf /var/lib/mysql
(2)在主機服務器上的/mydata/backups/2017-11-11_16-32-51/下執行innobackupex --apply-log --redo-only ./
innobackupex --apply-log --redo-only ./ --incremental-dir=/mydata/backups/2017-11-11_16-38-00
innobackupex --apply-log --redo-only ./ --incremental-dir=/mydata/backups/2017-11-11_16-41-24
innobackupex --apply-log ./ ——此步驟一定要做
此時將增量和全量合并成一個新的全量并復制到遠程數據庫上
搜狗截圖20171111194544.png

(3)在遠程服務器上庫中
chown -R mysql.mysql /var/lib/mysql/*
systemctl start mariadb
此時不適用 mysql < mybinlog.sql的方式來導入,而是將mybinlog,sql > /tmp目錄下,這樣其他用戶也可以訪問
(4)開啟mysql
use hellodb
. /tmp/mybinlog.sql
此時查看新修改的內容
select * from students where age=28;
搜狗截圖20171111195709.png

  • 注意:在主數據庫的/mydata/backups/中的 2017-11-11_16-32-51已經做了回滾,因此要建立新的全量備份
    innobackupex --user=root --password=magedu --host=localhost /mydata/backups/——新的全量備份
    (5)如果只做全量的話
    首先innobackupex --user=root --password=magedu --host=localhost /mydata/backups
    scp -r /mydata/backups/2017-11-11_16-10-53/ 172.18.25.62:/root
    在遠程數據庫上,關閉mariadb rm -rf /var/lib/mysql/*
    在遠程數據庫上執行 cd 2017-11-11_16-32-51/
    innobackupex --copy-back ./
    cd /var/lib/mysql/
    chown -R mysql.mysql ./
    systemctl start mariadb
    全量備份成功

三.mysql Replication

  • MySQL復制方式:主從復制,主主復制
    (1)主從復制master/slave
    Master: write/read——主數據庫具有讀寫功能
    Slaves: read——從服務器只有讀權限
    (2)設置主從復制的原因:
    冗余:promte(提升為主),異地災備
    人工
    工具程序:MHA擴展:轉移一部分“讀”請求;
    支援安全的備份操作;
    測試;
    (3)主/從架構:
  • 異步復制:
    1.一主多從;
    2.一從一主;
    3.級聯復制;主服務器——從服務器,該從服務又是另一個服務器的主服務器
    4.循環復制;
    5.雙主復制;
  • 半同步復制:
    一從多主:每個主服務器提供不同的數據庫;
    (4)配置:
    時間同步;
    復制的開始位置:
    從0開始;
    從備份中恢復到從節點后啟動的復制,復制的起始點備份操作時主節點所處的日志文件及其事件位置;
    注意:從服務器的版本號高于主服務器的版本號;
    1.主服務器:
    配置文件my.cnf
    server_id=#
    log_bin=log-bin
    啟動服務:
    mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD';
    mysql> FLUSH PRIVILEGES;
    2.從服務器:
    配置文件my.cnf
    server_id=#
    relay_log=relay-log
    read_only=ON
    啟動服務:
    mysql> CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='USERNAME',MASTER_PASSWORD='YOUR_PASSWORD',MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;
    mysql> START SLAVE [IO_THREAD|SQL_THREAD];
    mysql> SHOW SLAVE STATUS;

3.通過實驗來進行驗證
步驟:

  • 首先對配置文件進行設置 vim /etc/my.cnf.d/server.cnf


    搜狗截圖20171112150153.png
  • 在主服務器上做恢復數據
    cd /mydata/backups/2017-11-11_16-32-5
    執行 innobackupex --copy-back ./——恢復成功
    cd /var/lib/mysql
    chown -R mysql.mysql ./
  • 啟動Mysql數據庫
    連接數據庫mysql -uroot -pmagedu
    執行授權grant replication client,replication slave on . to 'repluser'@'172.18.%.%' identified by 'replpass';
    flush privileges
    搜狗截圖20171112154008.png
  • 進行備份并將備份數據復制到從服務器上
    采用邏輯備份方式
    mysqldump -uroot -magedu --all-databases -x(指定溫備方式) -E -R --trigger --flush-log --masater-data=2 > /root/all.sql
    scp /root/all.sql 172.18.25.62:/root
  • 在從服務器上執行vim /etc/my.cnf.d/server.cnf


    搜狗截圖20171112155537.png

    注意如果采用邏輯備份方式備份數據庫內容那么一定要先開啟mySQL后再恢復數據
    systemctl start mariadb
    mysql < all.sql
    開啟mysql


    搜狗截圖20171112155832.png
  • 設置從服務器數據庫的配置
    head -30 all.sql


    搜狗截圖20171112160123.png

    進入數據庫
    設置change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='master-log.000010',master_log_pos=245;
    查看從服務器狀態 show slave status\G


    搜狗截圖20171112160955.png

    搜狗截圖20171112161100.png

    現在在主服務器上進行一些修改
    use hellodb;

    select * from students;
    delete from students where name='agan';


    搜狗截圖20171112161907.png

    在從服務器上進行查看
    搜狗截圖20171112162012.png

    實現主從復制的目的
    注意:一般情況下要在從服務器上的配置文件中設置read_only=ON——但只對普通用戶有效,對root和超級用戶無效
    4.實現主主復制方式
    首先要在配置文件中進行設置
    搜狗截圖20171112163023.png

    在另一個服務器上
    搜狗截圖20171112163129.png

    開啟數據庫
    在主服務器上執行change master to master_host='172.18.25.62',master_user='repluser',master_password='replpass',master_log_file='mater-log.000001'(對方的文件),master_log_pos=245(開始的位置);

    start slave;
    show slave status\G
    在另一個服務器上執行
    change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='mater-log.000003'對方的文件),master_log_pos=245(開始的位置);
    start slave;
    show slave status\G
    實現雙主模式
    當在其中一臺服務器上執行例如:
    use hellodb;
    select * from students;
    delete from studens where id=10;
    再次執行select * from students
    然后在另一臺服務器上查看,發現現實內容和另一臺服務器相同
    當在server_id=1的主服務器上執行 insert into students (name.age,gender,major) values('am',18,'M','chushi'),('dasha',24,'F','fuwuyuan');
    查詢發現id號會從207開增加,并且步進為2
    而在server_id=2的數據庫上查看也是相同的,但是此時在該服務器上執行insert into students (name.age,gender,major) values('aam',22,'F','jishi'),
    再次查看發現id號會從210開始增加,而208號變為間隙ID

復制時應該注意的問題:

    1、從服務設定為“只讀”;
        在從服務器啟動read_only,但僅對非SUPER權限的用戶有效;
        
        阻止所有用戶:
            mysql> FLUSH TABLES WITH READ LOCK;
            
    2、盡量確保復制時的事務安全
        在master節點啟用參數:
            sync_binlog = ON 
            
            如果用到的是InnoDB存儲引擎:
                innodb_flush_logs_at_trx_commit=ON
                innodb_support_xa=ON
                
    3、從服務器意外中止時盡量避免自動啟動復制線程
            
    
    4、從節點:設置參數
        sync_master_info=ON
        
        sync_relay_log_info=ON
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容