pt-table-checksum 使用方法【轉】
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 MIXEDwhich 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