MySQL多線程導入導出 —— mydumper & myloader 簡介及常見用法

一、 簡介

之前介紹了mysqldump和mysqlpump兩種邏輯備份工具,但還是各有缺點。這裏介紹一個更強大的邏輯備份工具mydumper & myloader,前者用於備份或者用於恢復。

mysqldump  https://blog.csdn.net/Hehuyi_In/article/details/90045274

mysqlpump  https://blog.csdn.net/Hehuyi_In/article/details/102981945

 

1. mydumper優點

  • 採用C語言開發,使用glibc庫
  • 多線程備份,速度據說比mysqldump快10倍
  • 多線程恢復
  • 支持事務和非事務表的一致性備份(適用於0.2.2以上版本)
  • 備份後會生成多個備份文件(因爲是多線程備份)
  • 備份時對MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),會阻塞DML語句
  • 支持快速文件壓縮
  • 支持導出binlog(新版本已不支持)
  • 支持將備份文件切塊
  • 支持以守護進程模式工作,定時快照和連續二進制日誌

 

2. mydumper缺點

  • 不可指定字符集,代碼中寫死字符集爲binary,需要保證源與目標端字符集相同,否則可能出現亂碼
  • mydumper 工具沒有排除選項,可以使用正則選項 --regex 做反向匹配,例如 --regex'^(?!(sys))' 表示不備份sys庫
  • 快照功能有bug,無法正常使用,會導致內存泄漏

 

二、 mydumper安裝

mydumper安裝依賴軟件包:glibc, zlib, pcre, pcre-devel, gcc, gcc-c++, cmake, make, mysql客戶端庫文件

  • 安裝依賴軟件包
yum -y install glib2-devel zlib-devel pcre-devel mysql-devel
  • 安裝mysql客戶端,將客戶端庫文件路徑添加至/etc/ld.so.conf, 如/usr/local/mysql/lib
  • 解壓軟件包進入目錄,cmake .
  • make && make install
  • 安裝後 mydumper和myloader位於/usr/local/bin目錄下。

 

三、 參數詳解

1. mydumper

-B, --database              要備份的數據庫,不指定則備份所有庫(information_schema和performance_schema系統庫除外)
-T, --tables-list           需要備份的表,名字用逗號隔開,可以用正則表達式
-o, --outputdir             備份文件輸出的目錄,不指定默認爲當前目錄
-s, --statement-size        生成的insert語句的字節數,默認1000000字節,超過這個大小會生成新的insert語句
-r, --rows                  將表按行分塊時,指定多少行數據作爲一個塊,指定這個選項會關閉 --chunk-filesize
-F, --chunk-filesize        將表按指定大小分塊,單位是MB但使用該選項時不用帶單位,-F 2即可
-c, --compress              壓縮備份
-e, --build-empty-files     即使備份表數據是空,還是產生一個空文件(默認無數據只有表結構文件)
-x, --regex                 使用正則表達式匹配備份/不備份的對象
-i, --ignore-engines        指定備份時要忽略的存儲引擎,用逗號分割
-m, --no-schemas            不備份表結構
-d, --no-data               不備份表數據
-G, --triggers              備份觸發器
-E, --events                備份事件(job)
-R, --routines              備份存儲過程和函數
-W, --no-views              不備份視圖
-k, --no-locks              不使用臨時共享只讀鎖,這會造成備份數據不一致
--less-locking              最小化對InnoDB表的加鎖時間
-l, --long-query-guard      如果備份時遇到某查詢執行時間超過該選項指定值還沒完成,則退出備份。單位是秒,默認60秒
--kill-long-queries         如果備份時遇到某查詢執行時間超過該選項指定值還沒完成,kill掉該慢查詢,但不退出備份。
-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

 

2. myloader

-d, --directory                   備份文件的文件夾
-q, --queries-per-transaction     每次事物執行的查詢數量,默認是1000
-o, --overwrite-tables            如果要恢復的表存在,則先drop掉該表,使用該參數,需要備份時候要備份表結構
-B, --database                    需要還原到哪個數據庫(目標數據庫)
-e, --enable-binlog               指定加載數據時開啓數據庫實例的binlog記錄功能
-h, --host                        主機
-u, --user                        還原的用戶
-p, --password                    密碼
-P, --port                        端口
-s, --source-db                   需要還原哪個數據庫(源數據庫)
-S, --socket                      socket文件
-t, --threads                     還原所使用的線程數,默認是4
-C, --compress-protocol           壓縮協議
-V, --version                     顯示版本
-v, --verbose                     輸出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默認爲2

 

四、 mydumper備份原理及主要流程

  • 主線程執行 FLUSH TABLES WITH READ LOCK,施加全局只讀鎖、阻塞寫操作,以保證數據的一致性
  • 讀取備份點的binlog文件名和日誌寫入的位置並記錄在metadata文件中,以供即使點恢復使用
  • N個(線程數可以指定,默認是4)dump線程開啓讀一致的事務 START TRANSACTION WITH CONSISTENT SNAPSHOT;
  • dump non-InnoDB tables,首先導出非事務引擎表
  • 主線程 UNLOCK TABLES 非事務引擎表備份完後,釋放全局只讀鎖
  • dump InnoDB tables,基於事務導出InnoDB表
  • 事務結束

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

下面還有個更詳細的,不過感覺過於複雜了

 

五、 使用案例

1. 備份

備份所有庫(及二進制日誌):

mydumper -u root -p 'xxxxxDB2015!@#' -o /mnt/backup/

備份指定數據庫mysqlhqdb:

mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -o /mnt/backup/

備份多張表(tableA,tableB):

mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA,tableB -o /mnt/backup/

只備份tableA表的數據,不備份表結構

mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA -m -o /mnt/backup/

備份tableA表的數據並進行壓縮

mydumper -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -T tableA -c -o /mnt/backup/

 

備份所生成的文件

  • 所有的備份文件在一個目錄中,目錄可以自己指定
  • 對於一致性備份,會生成一個metadata文件。若是在主庫備份,其中會記錄備份數據庫在備份時間點的binlog文件名和寫入位置若是在從庫備份,還會記錄備份時同步至主庫的binlog文件名及寫入位置
  • 對每個庫,會生成一個 dbname-schema-create.sql 文件,存放建庫文件
  • 對每個表,會生成兩個備份文件:dbname.tbname-schema.sql 存放表結構文件,dbname.tbname.sql 表數據文件。如果對錶文件分片,將生成多個備份數據文件,可以指定行數或指定大小分片

 

2. 還原

還原mysqlhqdb庫

myloader -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -d /mnt/backup/

還原tableA表

myloader -u root -p 'xxxxxDB2015!@#' -B mysqlhqdb -o tableA -d /mnt/backup/

 

六、 mysqldump和mydumper的速度對比

首先用mydumper進行全庫備份,耗時爲12分鐘

time mydumper -u root -p 'xxxxxDB2015!@#' -o /mnt/backup/
# 輸出
real12m19.526s
user3m29.925s
sys0m36.017s

再用mysqldump全庫備份,耗時爲18分鐘

time mysqldump -uroot -p'xxxxxDB2015!@#' --single-transaction --all-databases > /mnt/backup/all.sql
# 輸出
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
real18m0.563s
user5m53.119s
sys0m48.295s

mydumper明顯比mysqldump快很多。

 

參考

https://blog.51cto.com/yanzongshuai/2109006

https://www.php.cn/mysql-tutorials-369167.html

https://www.cnblogs.com/linuxnote/p/3817698.html

http://blog.itpub.net/20893244/viewspace-2216615/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章