一、 簡介
之前介紹了mysqldump和mysqlpump兩種邏輯備份工具,但還是各有缺點。這裏介紹一個更強大的邏輯備份工具mydumper & myloader,前者用於備份或者用於恢復。
mysqldump https://blog.csdn.net/Hehuyi_In/article/details/90045274
mysqlpump https://blog.csdn.net/Hehuyi_In/article/details/102981945
1. mydumper優點
- 採用C語言開發,使用glibc庫
- 多線程備份,速度據說比mysqldump快10倍
- 多線程恢復
- 支持事務和非事務表的一致性備份(適用於0.2.2以上版本)
- 備份後會生成多個備份文件(因爲是多線程備份)
- 備份時對MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),會阻塞DML語句
- 支持快速文件壓縮
- 支持導出binlog(新版本已不支持)
- 支持將備份文件切塊
- 支持以守護進程模式工作,定時快照和連續二進制日誌
2. mydumper缺點
- 不可指定字符集,代碼中寫死字符集爲binary,需要保證源與目標端字符集相同,否則可能出現亂碼
- mydumper 工具沒有排除選項,可以使用正則選項 --regex 做反向匹配,例如 --regex'^(?!(sys))' 表示不備份sys庫
- 快照功能有bug,無法正常使用,會導致內存泄漏
二、 mydumper安裝
mydumper安裝依賴軟件包:glibc, zlib, pcre, pcre-devel, gcc, gcc-c++, cmake, make, mysql客戶端庫文件
- 安裝依賴軟件包
yum -y install glib2-devel zlib-devel pcre-devel mysql-devel
- 安裝mysql客戶端,將客戶端庫文件路徑添加至/etc/ld.so.conf, 如/usr/local/mysql/lib
- 解壓軟件包進入目錄,cmake .
- make && make install
- 安裝後 mydumper和myloader位於/usr/local/bin目錄下。
三、 參數詳解
1. mydumper
-B, --database 要備份的數據庫,不指定則備份所有庫(information_schema和performance_schema系統庫除外)
-T, --tables-list 需要備份的表,名字用逗號隔開,可以用正則表達式
-o, --outputdir 備份文件輸出的目錄,不指定默認爲當前目錄
-s, --statement-size 生成的insert語句的字節數,默認1000000字節,超過這個大小會生成新的insert語句
-r, --rows 將表按行分塊時,指定多少行數據作爲一個塊,指定這個選項會關閉 --chunk-filesize
-F, --chunk-filesize 將表按指定大小分塊,單位是MB但使用該選項時不用帶單位,-F 2即可
-c, --compress 壓縮備份
-e, --build-empty-files 即使備份表數據是空,還是產生一個空文件(默認無數據只有表結構文件)
-x, --regex 使用正則表達式匹配備份/不備份的對象
-i, --ignore-engines 指定備份時要忽略的存儲引擎,用逗號分割
-m, --no-schemas 不備份表結構
-d, --no-data 不備份表數據
-G, --triggers 備份觸發器
-E, --events 備份事件(job)
-R, --routines 備份存儲過程和函數
-W, --no-views 不備份視圖
-k, --no-locks 不使用臨時共享只讀鎖,這會造成備份數據不一致
--less-locking 最小化對InnoDB表的加鎖時間
-l, --long-query-guard 如果備份時遇到某查詢執行時間超過該選項指定值還沒完成,則退出備份。單位是秒,默認60秒
--kill-long-queries 如果備份時遇到某查詢執行時間超過該選項指定值還沒完成,kill掉該慢查詢,但不退出備份。
-b, --binlogs 導出binlog
-D, --daemon 啓用守護進程模式,守護進程模式以某個間隔不間斷對數據庫進行備份
-I, --snapshot-interval dump快照間隔時間,默認60s,需要在daemon模式下
-L, --logfile 使用的日誌文件名(mydumper所產生的日誌), 默認使用標準輸出
--tz-utc 跨時區是使用的選項,不解釋了
--skip-tz-utc 同上
--use-savepoints 使用savepoints來減少採集metadata所造成的鎖時間,需要 SUPER 權限
--success-on-1146 Not increment error count and Warning instead of Critical in case of table doesn't exist
-h, --host 連接的主機名
-u, --user 備份所使用的用戶
-p, --password 密碼
-P, --port 端口
-S, --socket 使用socket通信時的socket文件
-t, --threads 開啓的備份線程數,默認是4
-C, --compress-protocol 壓縮與mysql通信的數據
-V, --version 顯示版本號
-v, --verbose 輸出信息模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默認爲 2
2. myloader
-d, --directory 備份文件的文件夾
-q, --queries-per-transaction 每次事物執行的查詢數量,默認是1000
-o, --overwrite-tables 如果要恢復的表存在,則先drop掉該表,使用該參數,需要備份時候要備份表結構
-B, --database 需要還原到哪個數據庫(目標數據庫)
-e, --enable-binlog 指定加載數據時開啓數據庫實例的binlog記錄功能
-h, --host 主機
-u, --user 還原的用戶
-p, --password 密碼
-P, --port 端口
-s, --source-db 需要還原哪個數據庫(源數據庫)
-S, --socket socket文件
-t, --threads 還原所使用的線程數,默認是4
-C, --compress-protocol 壓縮協議
-V, --version 顯示版本
-v, --verbose 輸出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默認爲2
四、 mydumper備份原理及主要流程
- 主線程執行 FLUSH TABLES WITH READ LOCK,施加全局只讀鎖、阻塞寫操作,以保證數據的一致性
- 讀取備份點的binlog文件名和日誌寫入的位置並記錄在metadata文件中,以供即使點恢復使用
- N個(線程數可以指定,默認是4)dump線程開啓讀一致的事務 START TRANSACTION WITH CONSISTENT SNAPSHOT;
- dump non-InnoDB tables,首先導出非事務引擎表
- 主線程 UNLOCK TABLES 非事務引擎表備份完後,釋放全局只讀鎖
- dump InnoDB tables,基於事務導出InnoDB表
- 事務結束
mydumper的less locking模式:
mydumper使用--less-locking可以減少鎖等待時間,此時mydumper備份機制大致爲:
- 主線程執行 FLUSH TABLES WITH READ LOCK
- Dump線程 START TRANSACTION WITH CONSISTENT SNAPSHOT;
- LL Dump線程 LOCK TABLES non-InnoDB (線程內部鎖)
- 主線程UNLOCK TABLES
- LL Dump線程 dump non-InnoDB tables
- LL DUmp線程 UNLOCK non-InnoDB
- Dump線程 dump InnoDB tables
下面還有個更詳細的,不過感覺過於複雜了
五、 使用案例
1. 備份
備份所有庫(及二進制日誌):
mydumper -u root -p 'xxxxxDB2015!@#' -o /mnt/backup/
備份指定數據庫mysqlhqdb:
mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -o /mnt/backup/
備份多張表(tableA,tableB):
mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA,tableB -o /mnt/backup/
只備份tableA表的數據,不備份表結構
mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA -m -o /mnt/backup/
備份tableA表的數據並進行壓縮
mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA -c -o /mnt/backup/
備份所生成的文件
- 所有的備份文件在一個目錄中,目錄可以自己指定
- 對於一致性備份,會生成一個metadata文件。若是在主庫備份,其中會記錄備份數據庫在備份時間點的binlog文件名和寫入位置若是在從庫備份,還會記錄備份時同步至主庫的binlog文件名及寫入位置
- 對每個庫,會生成一個 dbname-schema-create.sql 文件,存放建庫文件
- 對每個表,會生成兩個備份文件:dbname.tbname-schema.sql 存放表結構文件,dbname.tbname.sql 表數據文件。如果對錶文件分片,將生成多個備份數據文件,可以指定行數或指定大小分片
2. 還原
還原mysqlhqdb庫
myloader -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -d /mnt/backup/
還原tableA表
myloader -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -o tableA -d /mnt/backup/
六、 mysqldump和mydumper的速度對比
首先用mydumper進行全庫備份,耗時爲12分鐘
time mydumper -u root -p 'xxxxxDB2015!@#' -o /mnt/backup/
# 輸出
real12m19.526s
user3m29.925s
sys0m36.017s
再用mysqldump全庫備份,耗時爲18分鐘
time mysqldump -uroot -p'xxxxxDB2015!@#' --single-transaction --all-databases > /mnt/backup/all.sql
# 輸出
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
real18m0.563s
user5m53.119s
sys0m48.295s
mydumper明顯比mysqldump快很多。
參考
https://blog.51cto.com/yanzongshuai/2109006
https://www.php.cn/mysql-tutorials-369167.html