天天看點

mydumper工作原理

相比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是線程不安全的?

mydumper工作原理

<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-&gt;queue);

    switch (job-&gt;type) {

        case JOB_DUMP:

            ....

            dump_table_data_file(thrconn, tj-&gt;database,

tj-&gt;table, tj-&gt;where, tj-&gt;filename);

        case JOB_DUMP_NON_INNODB:

        case JOB_SCHEMA:

            dump_schema_data(thrconn, sj-&gt;database,

sj-&gt;table, sj-&gt;filename);

}

當worker讀取到job_shutdown任務時,則會執行如下

case JOB_SHUTDOWN:

    g_message("Thread %d shutting down",

td-&gt;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-&gt;data;

        dump_table(conn, dbt-&gt;database, dbt-&gt;table,

&amp;conf, FALSE);

        g_atomic_int_inc(&amp;non_innodb_table_counter);

child_thread:當隊列中myisam為0時,加入unlock_tables任務

if (g_atomic_int_dec_and_test(&amp;non_innodb_table_counter)

&amp;&amp; g_atomic_int_get(&amp;non_innodb_done)) {

        g_async_queue_push(conf-&gt;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>