背 景
前天剛把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