Mysql主從同步校驗 與 恢復從庫丟失的數據

背 景

前天剛把Mysql從庫的同步開關(啓動I/O線程和啓動SQL線程)恢復正常,但是遺留問題還需要處理一下,也就是如何校驗主從庫同步與恢復從庫丟失的數據。

當然爲了防止有人在從庫寫入數據,我也對從庫用戶的權限做了限制,開放的從庫賬戶是沒有寫入權限的,開發們使用的都是這個賬戶。未開放的從庫賬戶是有寫入權限的,只有數據庫管理員才能使用這個賬戶。

即使這樣,還是避免不了類似於前天的突發狀況。在CPU飆升後,從庫的異步複製線程當掉了,待到發現時,已經有一部分數據未能及時同步到從庫。問題既然出現了,就想辦法解決吧。

一、從庫丟失的數據如何找回?

從庫丟失的數據,也就是從庫同步開關異常關閉到從庫開關正常的那一段時間,數據未能正常從主庫同步到從庫的這部分數據。網上的數據同步方案,無非就是兩種:全量同步和增量同步。

1、全量同步,簡單粗暴

先把主庫鎖表(只讀不能操作)、備份,接着把從庫同步停了並刪除,然後把主庫數據複製到從庫,最後再恢復主庫、從庫的狀態。全量同步的缺點也顯而易見,數據量大的時候數據導入耗時會比較長;主庫、從庫的狀態都停了,耽誤使用。

2、增量同步,操作起來比較麻煩

增量同步,先驗證從庫缺失的數據,然後把差異數據同步到從庫中。增量同步的優點顯而易見,只同步從庫沒有的數據、不一樣的數據,比較節約時間,還可以一個表一個表的同步,很適合已經上線的項目。

增量同步,可以採用MySQL自帶的checksum、mysqldiff、pt-table-checksum等工具。增量同步本次操作需要用到的工具簡單瞭解下。

2.1、pt–table-checksum

pt–table-checksum,用來檢測主從數據庫中數據的一致性。pt–table-checksum在主庫上運行, 對同步的表進行checksum, 記錄下來。然後對比主從中各個表的checksum是否一致, 從而判斷數據是否一致。

2.2、pt-table-sync

pt-table-sync,用來修復多個實例之間數據的不一致,它可以讓主從的數據修復到最終一致,也可以通過應用雙寫或多寫的多個不相關的數據庫實例修復到一致。同時它還內部集成了pt-table-checksum的校驗功能,可以一邊校驗一邊修復,也可以基於pt-table-checksum的計算結果來進行修復。

pt–table-checksum、pt-table-sync都是來自percona-toolkit的系列工具。

二、安裝 增量同步 需要的工具

1、安裝 percona-toolkit 所需的依賴包

yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL

中途有詢問是否繼續安裝:y

2、下載工具包 percona-toolkit

# 下載工具包
wget http://www.percona.com/get/percona-toolkit.tar.gz

3、解壓 percona-toolkit.tar.gz

# 解壓
tar zxvf percona-toolkit.tar.gz

4、進入percona-toolkit 目錄下,執行安裝。

# 進入percona-toolkit目錄
cd percona-toolkit-3.3.1
# 執行安裝
perl Makefile.PL
make && make install

從圖中可以看到 percona-toolkit下的一系列工具都被安裝了。

三、驗證主從庫數據是否一致

1、創建驗證用戶

在Master主庫上,創建驗證用戶。驗證用戶,用於校驗主從是否一致。驗證用戶的權限有SELECT,PROCESS,SUPER,REPLICATION SLAVE四個權限。

GRANT SELECT,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO '驗證用戶名'@'%' IDENTIFIED BY '驗證用戶密碼';

這一步也不是必須的,也可以使用主庫現有的具有這些權限的用戶。

2、執行數據驗證,查看主從庫數據是否一致。

# 驗證數據
/usr/local/bin/pt-table-checksum h='127.0.0.1',u='checksums',p='',P=3306 -d rsdun-circle --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format
  • h:主庫地址;

  • u:驗證用戶;

  • p:驗證用戶密碼;

  • P:主庫端口號;

  • -d: 指定要檢查數據庫;

  • --nocheck-replication-filters:不馬上檢查賦值結果;

  • --replicate:將查到的數據不一致的結果保存在某個庫的某個表;

  • --nocheck-binlog-format:不檢查日誌格式,默認檢查。

執行後報錯,據說是少了一個Digest-MD5包。

 # 安裝 Digest-MD5
 yum -y install perl-Digest-MD5

再次運行執行數據驗證:

執行結果還是有錯誤,缺少checksums表。因爲在校驗中--replicate=test.checksums,指定test庫的checksums表,test庫存在,checksums表不存在,那就在test庫中創建checksums表。

表創建成功後,再次執行數據是否同步的驗證,結果如下圖所示:


  • TS:完成檢查的時間;

  • ERRORS:檢查時候發生錯誤和警告的數量;

  • DIFFS:0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only僅僅顯示數據不一致的表信息;

  • ROWS:表的行數;

  • CHUNKS:被劃分到表中的塊的數目;

  • SKIPPED:由於錯誤或警告或過大,則跳過塊的數目;

  • TIME:執行的時間;

  • TABLE:被檢查的表名。

3、回到Slave從庫查看驗證結果;

SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;

執行結果圖:

執行結果如果爲空,則沒有需要同步的數據;執行結果如果不爲空,則有需要同步的數據。從上圖中可以發現,還是有很多數據不同步的。

三、同步數據

1、先打印出要修復的sql語句

#先利用print命令,打印出修改的語句但不執行,最好不要直接excute執行
/usr/local/bin/pt-table-sync h=127.0.0.1,P=3306,u=root,p=''  h=127.0.0.1,P=3307,u=root,p='' --charset=utf8 --databases=dbName --no-check-slave --transaction --verbose --print
  • h、P、u、p:第一組爲主庫的數據庫信息,第二組爲從庫的數據庫信息;

  • --databases:要同步的數據庫,多個逗號分隔;

  • --charset:設置數據庫編碼;

  • --no-check-slave:不檢查目標服務器是否是從庫服務器,默認檢查;

  • --transaction:指鎖表操作(LOCK TABLES)不會執行,取代的方式是通過事務的開始和提交來進行鎖定操作;

  • --verbose,-v 打印更詳細的操作信息;

  • --print:預覽要進行的數據修復;

  • --excute:執行數據修復。

執行結果:

2、數據同步

#把主庫和從庫的數據差異,同步到從庫
/usr/local/bin/pt-table-sync h=127.0.0.1,P=3306,u=root,p=''  h=127.0.0.1,P=3307,u=root,p='' --charset=utf8 --databases=dbName --no-check-slave --transaction --verbose --excute

從圖中可以看到,有數據同步到了從庫。

3、再次執行驗證

/usr/local/bin/pt-table-checksum h='127.0.0.1',u='checksums',p='',P=3306 -d rsdun-circle --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format

4、最後再去從庫看

SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;

當從從庫的checksums表中查到的結果爲空時,主從庫的數據也就同步成功了。

最 後 總 結

Mysql主從同步校驗 與 恢復從庫丟失的數據用到了兩個工具:pt–table-checksum 、pt-table-sync ,它們都是percona-toolkit 系列下的工具。pt-table-sync中涉及到很多參數,還需要在使用時注意,這裏也僅列出了使用的參數。

在使用前,需要先安裝percona-toolkit 工具以及相關的插件,還需要建立一個表用於存儲主從庫數據不一致的結果。然後才能執行主從庫數據是否一致的驗證,驗證做好了便可開始預覽需要同步的數據,最後在同步增量數據。

本文運行的數據庫環境是:一個主庫,一個從庫,主從庫都在一臺服務器上。主庫負責讀寫,從庫只負責讀。所以同步出現問題時,只會出現主庫數據沒有被從庫同步的情況。不會出現主庫沒有,從庫卻有的數據。參考本文時,請先對數據庫做備份。

官網參考:https://docs.percona.com/percona-toolkit/pt-table-sync.html
參考鏈接:https://blog.51cto.com/suifu/1836551
參數參考:https://www.cnblogs.com/dbabd/p/10653408.html
全量同步參考:https://codedefault.com/p/mysql-distributed

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