1. 程式人生 > >mydumper工作原理解析

mydumper工作原理解析

備份 mydumper

1、簡介

邏輯備份小鋼炮--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工作原理解析