在MySql主從複製架構的應用中,長時間啟動並執行DB出現各種異常之後,可能會有主備不一致的情況產生,偶爾會在同步時報錯,影響正常的業務訪問。那麼當我們遇到這種主從資料不一致的情況時如何去處理這種狀況,關於mysql的主從資料校正的工具也不少,但是我常用的是percona-toolkit提供的一些工具,順便簡單的做下記錄。
一、關於pt-table-checksum與pt-table-sync?
pt-table-checksum與pt-table-sync是percona 為mysql DBA 提供一些非常有用的效能診斷工具,此外還有我們經常在備份用到的XtraBackup,用這款基於物理備份工具為mysql的innodb提供熱備、myisam提供溫備。
pt-table-checksum用於校正主從資料的一致性,而pt-table-sync用於同步MySQL表之間的資料,它可以同步單個表,也可以同步整個庫,但是不同步表結構、索引、或任何其他模式對象。
二、安裝percona-toolkit:
# wget http://www.percona.com/redir/downloads/percona-toolkit/LATEST/deb/percona-toolkit_2.2.6.tar.gz
# cd ~/
# zxvf percona-toolkit_2.2.6.tar.gz
# cd percona-toolkit-2.2.6/
# perl Makefile.PL
# make
# make test
# make install
三、使用pt-table-checksum檢查資料是否一致在主庫執行):
使用方法:pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:用於校正主從資料的一致性,在主<M>上通過執行校正的查詢對複製的一致性進行檢查,對比主從的校正值,從而產生結果。DSN指向的是主的地址,不制定任何參數,會直接對本地的所有資料庫的表進行檢查。
例如:pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=db_test1 --replicate=db_test1.checksums --host=172.16.5.100 --port=3306 --user=root --password=123456
--nocheck-replication-filters :不檢查複製過濾器,建議啟用。後面可以用--databases來指定需要檢查的資料庫。
--no-check-binlog-format :不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不同步的資訊。(注意:要謹慎使用,此參數不會產生新的checksums資料,只會根據checksums表已經有的資料來顯示。)
--replicate= :把checksum的資訊寫入到指定表中,建議直接寫到被檢查的資料庫當中。
--databases= :指定需要被檢查的資料庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
h=127.0.0.1 :Master的地址
u=root :使用者名稱
p=123456 :密碼
P=3306 :連接埠
執行時顯示的結果參數說明:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
四、使用pt-table-sync修複不一致資料:
使用方法:pt-table-sync [OPTIONS] DSN [DSN]
pt-table-sync:高效的同步MySQL表之間的資料,他可以做單向和雙向同步的表資料。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修複一致性之前需要保證他們表存在。
例如:pt-table-sync --replicate=db_test1.checksums --databases=db_test1 --tables=table1,table2,table3,... --charset=utf8 h=127.0.0.1,u=root,p=123456 h=172.16.5.38,u=root,p=123 --print (建議先列印檢查執行的語句,再複製語句執行或再執行execute)
--replicate= :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
--databases= :指定執行同步的資料庫,多個用逗號隔開。
--tables= :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
h=127.0.0.1 :伺服器位址,命令裡有2個ip,第一次出現的是M的地址,第2次是Slave的地址。
u=root :帳號。
p=123456 :密碼。
--print :列印,但不執行命令。
--execute :執行命令。