27. pt-table-checksum
27.1 pt-table-checksum 作用
主要用來檢查主從數據是否一致,原理即在主庫執行把表每行的列通過concat函數進行拼接,然后對拼接的值進行hash,並把該動作通過binlog傳遞到從庫,從而在從庫上也執行相關操作(pt-table-checksum會自動設置所在會話的binlog_format=statment)。默認主庫上每對一個表完成checksum操作后,會等待所有從庫對該表完成checksum,然后比對主從庫上該表checksum值是否一致來判斷數據是否一致。
pt-table-checksum的使用有如下限制:
1) pt-table_checksum需要主庫的binlog_format=statement,在開始工作前,它會自動設置會話的binlog_format=statement,但是如果你的環境是級聯架構,中間主庫的binlog_format不會被修改(因為參數修改不會記錄到binlog),所以這種情況下,你可能就無法檢查中間主庫和它的從庫的數據是否一致。pt-table-checksum在進行checksum前會先檢查所有mysql服務的binlog_format(可以通過—no-check-binlog-format)
2) pt-table-checksum默認主庫要檢查的表在從庫都存在,並且同主庫表有相同的表結構。如果要檢查的表在從庫不存在,或者表結構同主庫不一致,那么對該表的checksum會破壞從庫復制線程。
##關於pt-table-checksum的詳細說明,請參考我的博客:
27.2 常用參數
常用參數請參考:pt-table-checksum 中文使用說明
http://blog.csdn.net/shaochenshuo/article/details/53098224
27.3 使用示例
27.3.1 檢查所有表的主從數據一致性問題
1) 主從庫都使用默認(3306)端口
grant all privileges on*.* to 'checksum'@'172.172.178.75' identified by 'root'; 首先在主庫(172.172.178.75)創建檢查用戶 ##如果只有主庫有這樣的用戶,而從庫沒有,報錯如下(這樣檢查結果diff都為0): Cannot connect to P=3306,h=172.172.178.76,p=...,u=checksum Cannot connect to P=3306,h=172.172.178.77,p=...,u=checksum Replica shao76 has binlog_format MIXED which could cause pt-table-checksum to break replication. Please read "Replicas using row-basedreplication" in the LIMITATIONS section of the tool's documentation. If you understand the risks, specify--no-check-binlog-format to disable this check. Replica shao77 ……….. ##我的主從庫(一主兩從)binlog_format都是mixed,所以這里報兩個從庫的binlog_format不為statement,可能會導致級聯的從庫復制出錯。(因為pt-table-checksum會自動把設置會話的binlog_format=statement,所以76和77的復制不會因為checksum而出問題) ##因為我這里沒有級聯從庫,所以可以直接指定--no-check-binlog-format來忽略該檢查: pt-table-checksum --set-vars innodb_lock_wait_timeout=120 -uchecksum -proot -h172.172.178.75 -P3306--no-check-binlog-format --quiet TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 11-18T09:40:29 0 1 3 1 0 0.284 test1.test_concat ##指定--quiet時只輸出errors,warnings和主從數據存在不一致的相關信息(在表非常多時該選項很有用)
2) 使用非默認端口(dsn指定從庫)
如果主庫使用非默認端口,--recursion-method默認值為hosts,這時如果從庫沒有配置report_host參數(注意該參數缺點),則pt-table-checksum無法自動檢測到從庫。
如果主庫使用的是默認端口,那么--recursion-method默認值為processlist,這時pt-table-checksum只能連上端口為3306的從庫,無法連接非默認端口的從庫
所以如果如果主庫或者從庫使用了非默認端口,建議通過dsn指定從庫信息
在主庫創建dsn表,並插入從庫信息 CREATE TABLE percona.`dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); insert into percona.dsns select 1,1,'h=172.172.178.76,u=checksum,p=root,P=3306'; insert into percona.dsns select 2,2,'h=172.172.178.77,u=checksum,p=root,P=3307'; pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=h=127.0.0.1,D=percona,t=dsns --set-varsinnodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306 --quiet TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 11-18T10:47:25 0 1 3 1 0 0.340 test1.test_concat ##上面的結果中我們只看到某些表主從數據不一致,但是確無法判斷到底哪個從庫和主庫數據不一致。我們可以在pt-table-checksum后,再次指定--replicate-check-only來執行pt-table-checksum,顯示具體信息,例如: pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns--set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--replicate-check-only Differences on shao76 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEXLOWER_BOUNDARY UPPER_BOUNDARY test1.test_concat 1 0 1
27.3.2 只檢查指定的數據庫,或者表
1) 只檢查指定數據庫下所有表
pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1,test5 --quiet
2) 只檢查指定表
pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1 --tables=test_concat --quiet 或者--tables=database.table pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--tables=test1.test_concat –quiet 或者--tables-regex正則匹配指定表 pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1 --tables-regex=test_*
27.3.3 檢查時忽略指定的數據庫,或者表
--ignore-databases,--ignore-databases-regex,--ignore-tables,--ignore-tables-regex 1) 忽略指定數據庫 pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306 --ignore-databases=test5,mysql --quiet ##percona數據庫默認被忽略 2) 忽略指定表 pt-table-checksum --nocheck-binlog-format --replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306 --ignore-tables-regex=test_* ##注意只能忽略所有庫下的test_*表,沒法指定只忽略某個庫下test_*表,而對其他庫下的test_*表進行檢查
27.3.4 只檢查指定表的某些列
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306 --databases=test1 --tables=test_concat --columns=id,name –quiet
27.3.5 檢查時忽略某些列
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns --set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306 --databases=test1 --ignore-columns=id --quiet
相關鏈接:
pt-table-sync 中文使用說明
http://blog.csdn.net/shaochenshuo/article/details/53285439
pt-table-checksum 中文使用說明
http://blog.csdn.net/shaochenshuo/article/details/53098224
pt-table-sync 使用方法
http://blog.csdn.net/shaochenshuo/article/details/56009234
---------------------
作者:database_shaofei
原文:https://blog.csdn.net/shaochenshuo/article/details/56009092