1. 程式人生 > >pt-table-checksum 使用方法【轉】

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