相比mysqldump,其優勢如下:
1 速度快(好多資料都說快10倍,個人持保留意見);
2 支援多線程導出和導入myloader;
3 采用守護程序方式運作,可定時掃描和快照binlog(-snapshot-interval);
4 快速檔案壓縮;
也有稍許不足之處,如mydumper不處理MySQL的視圖,觸發器和存儲過程,是以使用mydumper去導出schema并不可靠。<b></b>
實際生産環境中,建議mydumper僅用于導出資料(使用
--no-schemas ),而通過mysqldump來導出schema。
mydumper除了為每個表會分别生成table.sql和table-schema.sql,還會生成一個.metadata檔案,記錄dump的開始和結束時間,以及binlog位置資訊。
<b>參數</b>
-long-query-guard:長查詢上限(預設60s),如果目前資料庫存在運作時間大于此參數的查詢則退出mydumper;
-kill-long-queries:殺死查出的長查詢;
-daemon:啟用守護程序模式;
-snapshot-interval:快照時間間隔,預設60s;
-t, --threads 使用的線程數,預設4
-C, --compress-protocol 在mysql連接配接上使用壓縮
-e, --enable-binlog 啟用二進制恢複資料
-r, --rows 将表分成多個檔案批次導出,
1 确定表的行數,依據pk – uk – cardinality最高的索引(show index from table)選擇索引,通過explain select index from
table的rows字段确定行數;
2 已經total_rows和rows将表分成若幹分塊,每個分塊可由不同worker并行執行,适用于大表;
<b>安裝</b>
1 安裝cmake,apt-get install cmake;
2 安裝相容包,如apt-get install libglib2.0-dev
libmysqlclient15-dev,具體參照官網;
3 下載下傳安裝包并編譯
#tar xzvf mydumper-0.2.3.tar.gz
#cd mydumper-0.2.3/
#cmake .
#make
#make install
<b>原理</b>
Mysqldump是個單線程工具,隻能逐個導出表,而mydumper支援多線程并行導出;
盡管mydumper主線程已經登入進入了mysql,但worker子線程必須再登入一次,因為libmysql是線程不安全的?

<b>工作流程</b>
1 連接配接目标資料庫;
2 通過show
processlist來判斷是否有長查詢,如果有長查詢則退出dump(通過-long-query-guard指定),或者使用-kill-long-queries殺掉長查詢;
3 鎖定myisam表,flush tables with read lock; 針對innodb table開啟事務,start transaction;
4 建立worker子線程;
5 确定候選表,根據類别分别插入innodb_table,non_innodb_table以及table_schemas連結清單(表結構);
6 将候選表通過g_async_queue_push加入任務隊列(隊列最後元素是thread shutdown),由worker子線程從隊列中讀取表資訊并執行資料導出
for(;;) {
....
job=(struct job *)g_async_queue_pop(conf->queue);
switch (job->type) {
case JOB_DUMP:
....
dump_table_data_file(thrconn, tj->database,
tj->table, tj->where, tj->filename);
case JOB_DUMP_NON_INNODB:
case JOB_SCHEMA:
dump_schema_data(thrconn, sj->database,
sj->table, sj->filename);
}
當worker讀取到job_shutdown任務時,則會執行如下
case JOB_SHUTDOWN:
g_message("Thread %d shutting down",
td->thread_id);
if (thrconn)
mysql_close(thrconn);
g_free(job);
mysql_thread_end();
return NULL;
break;
7 執行unlock tables,處理完myisam表後立即解鎖,以減少鎖定時間;
Main_thread:記錄myisam數量
for (non_innodb_table= g_list_first(non_innodb_table);
non_innodb_table; non_innodb_table= g_list_next(non_innodb_table)) {
dbt= (struct db_table*)
non_innodb_table->data;
dump_table(conn, dbt->database, dbt->table,
&conf, FALSE);
g_atomic_int_inc(&non_innodb_table_counter);
child_thread:當隊列中myisam為0時,加入unlock_tables任務
if (g_atomic_int_dec_and_test(&non_innodb_table_counter)
&& g_atomic_int_get(&non_innodb_done)) {
g_async_queue_push(conf->unlock_tables,
GINT_TO_POINTER(1));
main_thread:主線程讀取unlock_tables任務并執行
g_async_queue_pop(conf.unlock_tables);
g_message("Non-InnoDB dump complete, unlocking tables");
mysql_query(conn, "UNLOCK TABLES");
8 等待worker退出;
Myloader将資料導入資料庫,原理與mydumper類似。
-queries-per-transaction
-directory
<b>參考資料</b>
<a href="http://www.hoterran.info/mydumper_usage">http://www.hoterran.info/mydumper_usage</a>
<a href="http://blogread.cn/it/article/4071">http://blogread.cn/it/article/4071</a>
<a href="http://centminmod.com/mydumper.html">http://centminmod.com/mydumper.html</a>