mydumper工作原理解析
邏輯備份小鋼炮--mydumper是針對MySQL的高性能多線程備份工具。該工具是由MySQL、Facebook、skysql公司的開發人員一起開發的。是由輕量級C語言開發;執行速度據說比mysqldump快10倍;支持事務和非事務表的一致性備份;還支持導出binlog;支持多線程備份;支持以守護進程的形式工作,定時備份;並且是開源的,其協議為GPLv3.
2、使用方法
root@dd:~/mydumper-0.6.2# ./mydumper --help Usage: mydumper [OPTION...] multi-threaded MySQL dumping Help Options: -?, --help Show help options Application Options: -B, --database 需要備份的庫 -T, --tables-list 需要備份的表,用逗號分隔 -o, --outputdir 輸出文件的目錄 -s, --statement-size 生成插入語句的字節數, 默認 1000000,這個參數不能太小,不然會報 Row bigger than statement_size for tools.t_serverinfo -r, --rows 分裂成很多行塊表 -c, --compress 壓縮輸出文件 -e, --build-empty-files 即使表沒有數據,還是產生一個空文件 -x, --regex 正則表達式: ‘db.table‘ -i, --ignore-engines 忽略的存儲引擎,用逗號分隔 -m, --no-schemas 不導出表結構 -k, --no-locks 不執行共享讀鎖 警告:這將導致不一致的備份 -l, --long-query-guard 設置長查詢時間,默認60秒,超過該時間則會報錯:There are queries in PROCESSLIST running longer than 60s, aborting dump --kill-long-queries kill掉長時間執行的查詢 -b, --binlogs 導出binlog -D, --daemon 啟用守護進程模式 -I, --snapshot-interval dump快照間隔時間,默認60s,需要在daemon模式下 -L, --logfile 日誌文件 -h, --host The host to connect to -u, --user Username with privileges to run the dump -p, --password User password -P, --port TCP/IP port to connect to -S, --socket UNIX domain socket file to use for connection -t, --threads 使用的線程數,默認4 -C, --compress-protocol 在mysql連接上使用壓縮協議 -V, --version Show the program version and exit -v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
3、原理解析
1)該工具在--daemo模式下支持以守護進行形式啟動,默認每60s進行一次備份。間隔時間由--snapshot-interval控制。
2)首先會創建一個MySQL服務的連接
3)然後在MySQL上執行show processlist,根據參數long-query-guard和kill-long-queries決定退出或殺掉長查詢;
4)根據是否有--lock-all-tables,進行鎖表:LOCK TABLE tn READ或者FLUSH TABLES WITH READ LOCK;然後執行START TRANSACTION;
5)創建4個備份表的子線程
6)創建1個work thread後,g_async_queue_pop(conf.ready);此時conf.ready為空需要sleep等待。
7)work線程執行:連接mysql;設置隔離級別RR;start transaction;g_async_queue_push(conf->ready,GINT_TO_POINTER(1));然後main函數的g_async_queue_pop掛住的地方可以喚醒了,繼續創建線程或者向下走。
8)work線程接著執行:進入死循環,從隊列裏pop出任務job=(struct job *)g_async_queue_pop(conf->queue);,根據任務類型進行dump。這裏的並行是根據表並行的。先備份非事務表,然後備份innodb表
9)最後等所有work線程完成非事務表備份後喚醒g_async_queue_pop(conf.unlock_tables);,執行UNLOCK TABLES解鎖
10)事務結束
mydumper工作原理解析