淺談mysqldump

Ⅰ、mysqldump的簡單使用與注意點

1.1 基本參數

只備份innodb,用不了幾個參數,記住下面幾個便可,其餘的沒什麼卵用mysql

-A 備份全部的database
-B 備份哪幾個數據庫
-R 備份存儲過程(-- routines)
-E 備份定時任務(-- events)
-d 只備份表結構
-w 備份過濾數據
-t 只備份數據
-q 直接讀數據,繞過緩衝池,默認已加,防止污染緩衝池
--triggers 備份觸發器
--master-data=2 在備份文件中以註釋的形式記錄備份開始時binlog的position,默認值是1,不註釋

tips:
①--set-gtid-purged=OFF 若是實例開了gtid最好加上這個參數,否則備份時候會報warning,且備份出來的數據恢復到其餘版本的實例上會報錯:A partial dump from a server that has GTIDs is not allowed.另外,若實例開啓gtid使用mysqldump時不加這個參數,備份文件中會設置不記錄binlog
②--dump-slave,該參數能夠用做在從庫作備份獲取主庫的位置點,來作一個新從庫,避免在主庫作備份影響業務,帶該參數備份時,從上sql線程會被kill,備份完再拉起算法

常見用法:sql

mysqldump --single-transaction -B test a > backup.sql    備份test庫和a庫
mysqldump --single-transaction test a > backup.sql       備份test庫下的a表
mysqldump --single-transaction test a -w "c=12"> backup.sql

1.2 其餘參數

--lock-tables(-l)
在備份中依次鎖住全部表,通常用於myisam備份,備份時數據庫只能提供讀操做,以此來保證數據一致性,該參數和--single-transaction是互斥的,因此實例中既存在myisam又存在innodb則,只能使用該參數

--lock-all-tables(-x)
比上面的參數力度更大,備份時將整個實例鎖住

1.3 重點

--single-transaction
必須加(一個事務中導出數據,確保產生一致性的備份數據)

my.cnf中配上下面配置數據庫

[mysqldump]
single-transaction
master-data=2

Ⅱ、實現原理剖析

2.1 開glog嗖哈一把(^__^)

session 1:
(root@localhost) [(none)]> truncate mysql.general_log;
Query OK, 0 rows affected (0.02 sec)

(root@localhost) [(none)]> set global general_log = 1;
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]> set global log_output = 'table';
Query OK, 0 rows affected (0.00 sec)

session 2:
[root@VM_0_5_centos src]# mysqldump --single-transaction --master-data=2 -B dump_test > /tmp/back.sql

session 1:
(root@localhost) [(none)]> set global general_log = 0;
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]> set global log_output = 'file';
Query OK, 0 rows affected (0.00 sec)

#拿到mysqldump線程對應操做的線程id
(root@localhost) [(none)]> select thread_id,left(argument,64) from mysql.general_log;

(root@localhost) [(none)]> select argument from mysql.general_log where thread_id=239 order by event_time;

FLUSH /*!40101 LOCAL */ TABLES
# 先把表刷一把,減小ftwrl鎖的等待時間
FLUSH TABLES WITH READ LOCK
# 把當前整個實例鎖成只讀
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
# 設置備份線程事務隔離級別爲rr
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
# 開啓事務
SHOW VARIABLES LIKE 'gtid\_mode'                                                                    
SHOW MASTER STATUS
# 得到當前二進制日誌位置
UNLOCK TABLES
# 釋放實例級別的只讀鎖
SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dump_test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
SHOW VARIABLES LIKE 'ndbinfo\_version'
dump_test
SHOW CREATE DATABASE IF NOT EXISTS `dump_test`
SAVEPOINT sp
# 使用savepoint sp,便於回滾,用於快速釋放metadata數據共享鎖
show tables                                                                                        
show table status like 'dump\_inno'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `dump_inno`
SET SESSION character_set_results = 'utf8'
show fields from `dump_inno`
show fields from `dump_inno`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `dump_inno`
SET SESSION character_set_results = 'binary'
use `dump_test`
select @@collation_database
SHOW TRIGGERS LIKE 'dump\_inno'
SET SESSION character_set_results = 'utf8'
# 以上部分備份數據
ROLLBACK TO SAVEPOINT sp                                                                            
RELEASE SAVEPOINT sp
# 回到savepoint sp,釋放metadata的鎖
# 每取一張表的數據,就rollback to savepoint sp(一個savepoint就夠了)

root@localhost on  using Socket
/*!40100 SET @@SQL_MODE='' */
/*!40103 SET TIME_ZONE='+00:00' */

2.2 mysqldump流程小結

- 操做 解析
step1 FLUSH TABLES/FLUSH TABLES WITH READ LOCK 將實例鎖成只讀
step2 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ/START TRANSACTION 開啓rr隔離級別的事務
step3 SHOW MASTER STATUS/UNLOCK TABLES 獲取二進制日誌位置並釋放全局讀鎖
step4 SAVEPOINT sp 設置回滾點
step5 SELECT xxx 備份數據
step6 ROLLBACK TO SAVEPOINT sp/RELEASE SAVEPOINT sp 結束一張表備份,回到sp

2.3 關鍵點細說

  • start transaction with consistent snapshot

位置點問題:事務隔離級別是rr,開始事務,而且立刻建立一個read_view,因此mysqldump備份的數據是備份開始時候的數據而不是備份結束時的數據(備份了30min,整個過程實例一直可讀可寫,備份的是30min以前的數據而不是30min以後的數據)centos

執行start transaction同時(而不是等到執行第一條sql)創建與本事務一致性讀的snapshot服務器

  • --single-transaction

全部的數據都是在一個事務裏面讀出來,並且事務隔離級別是如rr的,因此讀到的數據是一致的session

一致性備份:整個備份從start transaction開始,備份全部的表,全部的表的數據都是在一個事務裏面,經過select導出來ssh

  • savepoint保存點(4.1仍是5.0加進來的)

savepoint不多用,真正用的最多就是備份的時候,一張表備份完,會回滾到對應保存點,此時對應備份的表上面的元數據鎖都釋放,這時候能夠這個表能夠作ddl操做線程

不然在一個事務裏,持有元數據鎖,要作ddl(好比其餘線程想對這裏一個表建立索引),即便備份完了也作不了,要等全部備份結束才能動日誌

沒有savepoint時,只讀鎖要持有整個事務時間,而不是表備份的時間

Ⅲ、實戰

3.1 備份而且壓縮

mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest | pv | gzip -c > sbtest.backup.tgz

壓縮過的備份恢復

gunzip < sbtest.backup.tgz |mysql

3.2 壓縮到遠程服務器

mysqldump --single-transaction --master-data=1 --triggers -R -E -B sbtest |gzip -c |ssh root@test-3 'cat > /tmp/sbtest.sql.gz'

備份校驗,另行考慮

3.3 備份文件使用

mysql < xxx.sql;

tips:備份佔用帶寬很大,須要調度算法確保同一個集羣中同時只有一個機器作備份,或者不天天作備份從而錯開備份時間

相關文章
相關標籤/搜索