前言
mysql有不少備份、恢復工具,最經常使用的就是mysqldump,可是通常是數據量較小的時候使用。html
在大數據量備份恢復時,例如超過30G的數據量,推薦採用mydumper、mysqlpump、Xtrabackup這樣的工具。mysql
相比而言,mydumper更輕量,而且導出的是sql文件。正則表達式
Xtrabackup則是基於底層數據文件備份。sql
mysqlpump是5.7官方自帶工具,也是多線程備份,命令與mysqldump相似,效率比mydumper要高。數據庫
而mydumper則能夠導出5.5及如下版本數據。這點在老版本升級遷移到新機器時尤其重要。微信
粗略地從效率上排個名,則是多線程
Xtrabackup > mysqlpump > mydumper > mysqldump。架構
P.S 還有種高效的恢復方式就是,就是使用mysqlbinlog。app
mydumper介紹
原文:https://www.cnblogs.com/keme/p/11679446.htmlless
做者:keme
Mydumper是一個針對MySQL和Drizzle的高性能多線程備份和恢復工具。
當前最新版本0.9.1
Mydumper主要特性:
•輕量級C語言寫的•多線程備份,備份後會生成多個備份文件•事務性和非事務性表一致的快照•快速的文件壓縮•支持導出binlog•多線程恢復•以守護進程的工做方式,定時快照和連續二進制日誌•開源 (GNU GPLv3)
mydumper下載安裝
# 安裝依賴yum -y install glib2-devel mysql-devel zlib-devel pcre-devel zlib gcc-c++ gcc cmake
# 下載wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz
tar zxf mydumper-0.9.1.tar.gzcd mydumper-0.9.1/
# 編譯安裝cmake .makemake install
#安裝完成後生成兩個二進制文件mydumper和myloader位於/usr/local/bin目錄下ls /usr/local/bin/
切出其餘目錄,執行下命令看看,有沒有此命令
cd /home/mysqlmydumpermyloader
若是反饋以下,說明安裝成功了
[root@iZm5eh3yfwvy52yb78f6obZ mydumper-0.9.1]# cd /home/mysql[root@iZm5eh3yfwvy52yb78f6obZ mysql]# mydumper
** (mydumper:15685): CRITICAL **: 22:37:54.001: Error connecting to database: Access denied for user 'root'@'localhost' (using password: NO)[root@iZm5eh3yfwvy52yb78f6obZ mysql]# myloader
** (myloader:15691): CRITICAL **: 22:37:59.358: a directory needs to be specified, see --help
經常使用命令
# 備份 mydumper -u root -p 123456 -P 3306 -B db1 -o /data/backupmydumper -u root -p bV09eZ4a3v -P 3306 -B db1 -o /data/backup
# 恢復myloader -u root -p 123456 -B beta -d /data/backup/mysql/
# 恢復 -t16表明開啓16個線程,因爲我這個機器是8核的,因此我開了這麼多線程,-t默認4線程myloader -u root -p 123456 -t16 -B beta -d /data/backup/mysql/
# 恢復2 加上統計時間time myloader -u root -p 123456 -t16 -B beta -d /data/backup/mysql/
案例實踐
查看導出數據及時間:
# 導出db1庫到/home/mysql/backup/ mydumper -u root -p bV09eZ4a3v -P 3306 -B db1 -o /home/mysql/backup/
# 查看backup大小[root@iZm5ebq5g3dxxlguud3akeZ backup]# du -sh6.4G
# 查看metadata[root@iZm5ebq5g3dxxlguud3akeZ backup]# cat metadata Started dump at: 2020-04-01 15:33:59Finished dump at: 2020-04-01 15:34:23
# 統計恢復時間[root@iZm5ebq5g3dxxlguud3akeZ backup]# time myloader -u root -p 123456 -t 16 -B db1 -d /home/mysql/backup/
real 5m2.272suser 0m10.201ssys 0m3.815s
導出數據爲6G,從metadata中記錄的時間能夠看到只用了24秒,恢復6.4G數據花了5分2秒。
而另外一方面,一樣的機器,使用16線程,恢復用了4分45秒。
…… # 16線程恢復real 4m45.513suser 0m13.387ssys 0m6.064s
…… # 8線程恢復real 4m2.297suser 0m13.087ssys 0m4.570s
可是8線程恢復卻反而要快點,4分2秒。
注意項
•mydumper的多線程備份與恢復機制,是基於表的。也就是若是某張表的數據超大,導出速度其實比單線程快不了多少。•mydumper支持 5.5,這點很重要。若是是5.7版本,可使用官方的多線程備份工具mysqlpump。
備份過程解析
1. 第一個發起備份的tcp信息FLUSH TABLES WITH READ LOCK # 加全局鎖,防止寫入START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ # 開啓事務/*!40101 SET NAMES binary*/ # 獲取當前數據庫的狀態信息,就是數據庫當前正在使用的二進制日誌及當前執行二進制日誌位置,執行了哪些GTIDSHOW MASTER STATUSSHOW SLAVE STATUS
2. 剩下的4個tcp 信息內容基本是同時工做的(也就是多線程),內容都是SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ #把當前會話事務隔離級別改成可重複讀START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */ # 開啓事務
3. 獲取相應的庫信息,表信息,數據信息Init DB betaSHOW TABLE STATUSSHOW CREATE DATABASE `beta`SELECT /*!40001 SQL_NO_CACHE */ * FROM `beta`.`t1`SELECT /*!40001 SQL_NO_CACHE */ * FROM `beta`.`t2`SHOW CREATE TABLE `beta`.`t1`SHOW CREATE TABLE `beta`.`t2`
4. 解鎖UNLOCK TABLES /* FTWRL */
5. 最後備份結束,退出事務
備份原理
•一、主線程 FLUSH TABLES WITH READ LOCK, 施加全局只讀鎖,保證數據的一致性 * 二、讀取當前時間點的二進制日誌文件名和日誌寫入的位置並記錄在metadata文件中,以供即便點恢復使用•三、N個(線程數能夠指定,默認是4)dump線程把事務隔離級別改成可重複讀 並開啓讀一致的事物•四、dump non-InnoDB tables, 首先導出非事物引擎的表•五、主線程 UNLOCK TABLES 非事物引擎備份完後,釋放全局只讀鎖•六、dump InnoDB tables, 基於事物導出InnoDB表•七、事物結束
備份工具mydumper參數
-B, --database 要備份的數據庫,不指定則備份全部庫-T, --tables-list 須要備份的表,名字用逗號隔開-o, --outputdir 備份文件輸出的目錄-s, --statement-size 生成的insert語句的字節數,默認1000000-r, --rows 將表按行分塊時,指定的塊行數,指定這個選項會關閉 --chunk-filesize-F, --chunk-filesize 將表按大小分塊時,指定的塊大小,單位是 MB-c, --compress 壓縮輸出文件-e, --build-empty-files 若是表數據是空,仍是產生一個空文件(默認無數據則只有表結構文件)-x, --regex 是同正則表達式匹配 'db.table'-i, --ignore-engines 忽略的存儲引擎,用都厚分割-m, --no-schemas 不備份表結構-k, --no-locks 不使用臨時共享只讀鎖,使用這個選項會形成數據不一致--less-locking 減小對InnoDB表的鎖施加時間(這種模式的機制下文詳解)-l, --long-query-guard 設定阻塞備份的長查詢超時時間,單位是秒,默認是60秒(超時後默認mydumper將會退出)--kill-long-queries 殺掉長查詢 (不退出)-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
恢復工具myloader參數
-d, --directory 備份文件的文件夾-q, --queries-per-transaction 每次事物執行的查詢數量,默認是1000-o, --overwrite-tables 若是要恢復的表存在,則先drop掉該表,使用該參數,須要備份時候要備份表結構-B, --database 須要還原的數據庫-e, --enable-binlog 啓用還原數據的二進制日誌-h, --host 主機-u, --user 還原的用戶-p, --password 密碼-P, --port 端口-S, --socket socket文件-t, --threads 還原所使用的線程數,默認是4-C, --compress-protocol 壓縮協議-V, --version 顯示版本-v, --verbose 輸出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默認爲2
本文分享自微信公衆號 - 架構師之殤(ysistrue)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。