1. 程式人生 > >MySQL pt-table-checksum及pt-table-sync校驗及修復主從一致性

MySQL pt-table-checksum及pt-table-sync校驗及修復主從一致性

錯誤 tables 數據庫實例 span isnull select 配置參數 syn master

【pt-table-checksum】
pt-table-checksum是percona-toolkit系列工具中的一個, 可以用來檢測主、 從數據庫中數據的一致性。其原理是在主庫上運行, 對同步的表進行checksum, 記錄下來。 然後對比主從中各個表的checksum是否一致, 從而判斷數據是否一致。檢測過程中以塊為單位, 對於大的表可以區分為多個塊, 從而避免鎖表( 根據唯一索引將表切分為塊)檢測時會自動判斷復制延遲、 master的負載, 超過閥值後會自動將檢測暫停。

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

  • 校驗(Master服務器運行)
pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=120 --databases newtable -u‘checksums‘ -p‘checksums‘ -h10.1.1.6

#-h -u -p -P -S -d 連接信息
#--nocheck-replication-filters 檢測中忽略mysql 配置參數binlog_ignore_db等。
#--nocheck-binlog-format 不檢測日誌格式
#--replicate 指定checksum 存儲的db和表, 如test.checksum
# --chunk-size, --chunk-size-limit 用於指定檢測塊的大小。 可控性更強
# --ignore-databases/tables/column 跳出指定元素的過濾
# --lock-wait-timeout innodb 鎖的超時設定, 默認為1
# --max-load 設置最大並發連接數
# --replicate-check-only 只輸出數據不一致的信息。
# --help 有這個就行了, 以及其他的詳見文檔。

備註:--no-check-binlog-format 忽略檢查binlog格式,否則會報錯,默認會去檢查statement模式,一般我們都用row模式

  技術分享

TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。

備註:主要觀察DIFFS列,標識差異數。

  • 查看差異(Slave庫運行)
select db, tbl, sum(this_cnt) as total_rows, count(*) as chunks  
 from checksums 
where ( master_cnt <> this_cnt OR master_crc <> this_crc OR isnull(master_crc) <> isnull(this_crc) )
 group by db, tbl; 

  

  • 復制,消除差異(Master服務器運行)

假設newtables數據庫tb1表存在差異

i.自動消除差異(不推薦)
pt-table-sync --print --execute --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘ --databases=newtables --tables=tb1

ii.打印出sql語句,人工幹預到Slave庫執行(推薦)
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘ --databases=newtables --tables=tb1
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p=‘checksums‘--replicate pt.checksums

#--sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
#--replicate :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
#--print :打印,但不執行命令。
#--execute :執行命令。

  備註:Slave需要授權主庫Drop 和Create Temporary Tables權限

  • 檢驗

重新執行一次pt-table-checksum,查看是否還存在差異。

MySQL pt-table-checksum及pt-table-sync校驗及修復主從一致性