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 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM