http://www.tuicool.com/articles/2eAVVvN
MySQL 自身的 mysqldump 工具支持單線程工作, 依次一個個導出多個表,沒有一個並行的機 ,這就使得它無法迅速的備份數據。
mydumper 作爲一個實用工具,能夠良好支持多線程工作, 可以並行的多線程的從表中讀入數據並同時寫到不同的文件裏 ,這使得它在處理速度方面快於傳統的 mysqldump 。其特徵之一是在處理過程中需要對列表加以鎖定,因此如果我們需要在工作時段執行備份工作,那麼會引起 DML 阻塞。但一般現在的 MySQL 都有主從,備份也大部分在從上進行,所以鎖的問題可以不用考慮。這樣, mydumper 能更好的完成備份任務。
mydumper 特性
多線程備份
因爲是多線程邏輯備份,備份後會生成多個備份文件
備份時對 MyISAM 表施加 FTWRL (FLUSH TABLES WITH READ LOCK), 會阻塞DML 語句
保證備份數據的一致性
支持文件壓縮
支持導出binlog
支持多線程恢復
支持以守護進程模式工作,定時快照和連續二進制日誌
支持將備份文件切塊
mydumper 的安裝
mydumper 使用 c 語言編寫,使用 glibc 庫
mydumper 安裝所依賴的軟件包, glibc, zlib, pcre, pcre-devel, gcc, gcc-c++, cmake, make, mysql 客戶端庫文件
安裝依賴軟件包,將 mysql 客戶端庫文件路徑添加至 /etc/ld.so.conf, 如 /usr/local/mysql/lib
解壓軟件包進入目錄, cmake .
make && make install
安裝完成後生成兩個二進制文件 mydumper 和 myloader 位於 /usr/local/bin 目錄下
mydumper 備份機制
mydumper 工作流程圖
主要步驟概括
主線程 FLUSH TABLES WITH READ LOCK , 施加全局只讀鎖,以阻止 DML 語句寫入,保證數據的一致性
讀取當前時間點的二進制日誌文件名和日誌寫入的位置並記錄在 metadata 文件中,以供即使點恢復使用
N 個(線程數可以指定,默認是 4 ) dump 線程 START TRANSACTION WITH CONSISTENT SNAPSHOT ; 開啓讀一致的事物
dump non-InnoDB tables , 首先導出非事物引擎的表
主線程 UNLOCK TABLES 非事物引擎備份完後,釋放全局只讀鎖
dump InnoDB tables , 基於事物導出 InnoDB 表
事物結束
備份所生成的文件
所有的備份文件在一個目錄中,目錄可以自己指定
目錄中包含一個 metadata 文件
記錄了備份數據庫在備份時間點的二進制日誌文件名,日誌的寫入位置,
如果是在從庫進行備份,還會記錄備份時同步至主庫的二進制日誌文件及寫入位置
每個表有兩個備份文件:
database.table-schema.sql 表結構文件
database.table.sql 表數據文件
如果對錶文件分片,將生成多個備份數據文件,可以指定行數或指定大小分片
mydumper 和 myloader 的使用
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
使用案例 備份 game 庫到 /backup/01 文件夾中,並壓縮備份文件
mydumper -u root -p ### -h localhost -B game -c -o /backup/01
備份所有數據庫,並備份二進制日誌文件,備份至 /backup/02 文件夾
mydumper -u root -p ### -h localhost -o /backup/02
備份 game.tb_player 表,且不備份表結構,備份至 /backup/03 文件夾
mydumper -u root -p ### -h localhost -T tb_player -m -o /backup/03
還原
mysqlload -u root -p ### -h localhost -B game -d /backup/02
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