mydumper 備份原理和使用方法(備份mysql)

一:個人使用環境:CentOS6.5  + Mysql5.7mysql

MySQL備份工具比較:linux

一、mysqldump:屬於邏輯備份,會存在鎖表,但考慮到數據量比較大,鎖表的時間會比較長,業務不容許,pass掉;正則表達式

二、xtrabackup:屬於物理備份,不存在鎖表,但考慮到2臺DB使用的都是共享表空間,同時在業務B的數據庫進行恢復時,一是時間比較長,二是數據確定不正確,pass掉(測試過);sql

三、mydumper:屬於邏輯備份,是一個多線程、高性能的數據邏輯備份、恢復的工具,且鎖表的時間很短(40G數據,10分鐘之內),同時會記錄binlog file和pos,業務能夠接受。數據庫

二:介紹多線程

MySQL 自身的 mysqldump 工具支持單線程工做, 依次一個個導出多個表,沒有一個並行的機 ,這就使得它沒法迅速的備份數據。less

mydumper 做爲一個實用工具,可以良好支持多線程工做, 能夠並行的多線程的從表中讀入數據並同時寫到不一樣的文件裏 ,這使得它在處理速度方面快於傳統的 mysqldump 。其特徵之一是在處理過程當中須要對列表加以鎖定,所以若是咱們須要在工做時段執行備份工做,那麼會引發 DML 阻塞。但通常如今的 MySQL 都有主從,備份也大部分在從上進行,因此鎖的問題能夠不用考慮。這樣, mydumper 能更好的完成備份任務。socket

mydumper 特性工具

輕量級C語言寫的性能

  1. 執行速度比mysqldump快10倍
  2. 保證事務性和非事務性表一致的快照(適用於0.2.2以上版本)
  3. 快速的文件壓縮
  4. 支持導出binlog(新版本里已經不能備份binlog)
  5. 支持將備份文件切塊
  6. 支持多線程備份(由於是多線程邏輯備份,備份後會生成多個備份文件)
  7. 支持多線程恢復(適用於0.2.1以上版本)
  8. 備份時對MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),會阻塞DML語句
  9. 支持以守護進程的工做方式,定時快照和連續二進制日誌(適用於0.5.0以上版本)
  10. 支持將備份文件切塊
  11. 開源 (GNU GPLv3)

三: mydumper 的安裝

首先你要安裝cmake 、make 工具

mydumper 使用 c 語言編寫,使用 glibc 庫

官方下載地址:

https://launchpad.net/mydumper/+download

linux  wget下載:

#wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz

首先安裝依賴包

# yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel

#tar -xvzf mydumper-0.9.1.tar.gz
#cd mydumper-0.9.1
#cmake .

#make && make install

安裝完成後生成兩個二進制文件 mydumper 和 myloader 位於 /usr/local/bin 目錄下

mydumper 備份機制

此處省略10000字...

主要步驟歸納

  1. 主線程 FLUSH TABLES WITH READ LOCK , 施加全局只讀鎖,以阻止 DML 語句寫入,保證數據的一致性
  2. 讀取當前時間點的二進制日誌文件名和日誌寫入的位置並記錄在 metadata 文件中,以供即便點恢復使用
  3. N 個(線程數能夠指定,默認是 4 ) dump 線程 START TRANSACTION WITH CONSISTENT SNAPSHOT ; 開啓讀一致的事物
  4. dump non-InnoDB tables , 首先導出非事物引擎的表
  5. 主線程 UNLOCK TABLES 非事物引擎備份完後,釋放全局只讀鎖
  6. dump InnoDB tables , 基於事物導出 InnoDB 表
  7. 事物結束

備份所生成的文件

  • 全部的備份文件在一個目錄中,目錄能夠本身指定
  • 目錄中包含一個 metadata 文件

記錄了備份數據庫在備份時間點的二進制日誌文件名,日誌的寫入位置,

若是是在從庫進行備份,還會記錄備份時同步至主庫的二進制日誌文件及寫入位置

  • 每一個表有兩個備份文件:

database.table-schema.sql 表結構文件

database.table.sql 表數據文件

若是對錶文件分片,將生成多個備份數據文件,能夠指定行數或指定大小分片

mydumper 和 myloader 的使用

mydumper 參數

-B, --database              要備份的數據庫,不指定則備份全部庫
-T, --tables-list           須要備份的表,名字用逗號隔開
-o, --outputdir             備份文件輸出的目錄
-s, --statement-size        生成的insert語句的字節數,默認1000000
-r, --rows                  將表按行分塊時,指定的塊行數,指定這個選項會關閉 --chunk-filesize
-F, --chunk-filesize        將表按大小分塊時,指定的塊大小,單位是 MB
-c, --compress              壓縮輸出文件
-e, --build-empty-files     若是表數據是空,仍是產生一個空文件(默認無數據則只有表結構文件)
-x, --regex                 是同正則表達式匹配 'db.table'
-i, --ignore-engines        忽略的存儲引擎,用都厚分割
-m, --no-schemas            不備份表結構
-k, --no-locks              不使用臨時共享只讀鎖,使用這個選項會形成數據不一致
--less-locking              減小對InnoDB表的鎖施加時間(這種模式的機制下文詳解)
-l, --long-query-guard      設定阻塞備份的長查詢超時時間,單位是秒,默認是60秒(超時後默認mydumper將會退出)
--kill-long-queries         殺掉長查詢 (不退出)
-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

myloader使用參數

-d, --directory                   備份文件的文件夾
-q, --queries-per-transaction     每次事物執行的查詢數量,默認是1000
-o, --overwrite-tables            若是要恢復的表存在,則先drop掉該表,使用該參數,須要備份時候要備份表結構
-B, --database                    須要還原的數據庫
-e, --enable-binlog               啓用還原數據的二進制日誌
-h, --host                        主機
-u, --user                        還原的用戶
-p, --password                    密碼
-P, --port                        端口
-S, --socket                      socket文件
-t, --threads                     還原所使用的線程數,默認是4
-C, --compress-protocol           壓縮協議
-V, --version                     顯示版本
-v, --verbose                     輸出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默認爲2

使用案例 備份 game 庫到 /backup/01 文件夾中,並壓縮備份文件

mydumper -u root -p ### -h localhost -B game -c -o /backup/01

備份全部數據庫,並備份二進制日誌文件,備份至 /backup/02 文件夾

mydumper -u root -p ### -h localhost -o /backup/02

備份 game.tb_player 表,且不備份表結構,備份至 /backup/03 文件夾

mydumper -u root -p ### -h localhost -T tb_player -m -o /backup/03

還原

myloader -u root -p ### -h localhost -B game -d /backup/02

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

binary logs(新版已廢棄)

啓用--binlogs選項後,二進制文件存放在binlog_snapshot目錄下

daemon mode

  • 在這個模式下,有五個目錄0、一、binlogs、binlog_snapshot、last_dump。

  • 備份目錄是0和1,間隔備份,若是mydumper因某種緣由失敗而仍然有一個好的快照,當快照完成後,last_dump指向該備份。

以當天日期時間做爲名稱建立文件夾

#mkdir `date +%Y%m%d%H%M%S`

舉例使用:

備份

 #mydumper -u root -p PWD -h IP -B funds_balance -c -o / opt/`date +%Y%m%d%H%M%S` 

還原

# myloader -u root -p PWD -h IP -B funds_balance -d /opt/20160923161614

相關文章
相關標籤/搜索