主從複製環境中,可能有種種原因導致主、從庫資料不一致的情況,主從一致性也一直是DBA需要關注的問題,校驗MySQL的主從一致性一般有多種工具,諸如MySQL自帶的checksum、mysqldiff、pt-table-checksum等,每種工具各有優缺,本文就pt-table-checksum工具進行介紹和記錄實驗環節。

 

下載二進位制版本的percona-toolkit工具箱

https://www.percona.com/downloads/percona-toolkit

本文用的是2.2.18版本

[root@HE3
~]# tar xvf percona-toolkit-2.2.18.tar.gz

[root@HE3
~]# cd percona-toolkit-2.2.18

[root@HE3
percona-toolkit-2.2.18]# perl Makefile.PL

[root@HE3 percona-toolkit-2.2.18]# make && make install

 

 

主庫建立checksums使用者用於校驗主從是否一致

mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO `checksums`@`%` IDENTIFIED BY `MANAGER`;

開始執行校驗,在校驗結束後,會在test庫下建立表名為checksums的表用於儲存主從一致性資訊

[root@HE3 ~]#/usr/local/bin/pt-table-checksum h=`192.168.1.250`,u=`checksums`,p=`MANAGER`,P=3306 -d www --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format

 

從庫可以執行本條SQL來檢視哪些表有主從不一致的情況,此時主從是一致的所以沒有結果

mysql> SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;
Empty set (0.03 sec)

 

我們先刪除www庫下的某張表的某一行

[SQL]delete from decorate_order where id=10;
受影響的行: 1
時間: 0.003s

 

 

再次執行同步校驗

[root@HE3 ~]#/usr/local/bin/pt-table-checksum h=`192.168.1.250`,u=`checksums`,p=`MANAGER`,P=3306 -d www --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format

 

可以發現在從庫上執行本條SQL可以看到主從不一致的表名

mysql> SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;
+-----+----------------+------------+--------+
| db  | tbl            | total_rows | chunks |
+-----+----------------+------------+--------+
| www |
decorate_order |      25356 |      1 |
+-----+----------------+------------+--------+
1 row in set (0.00sec)

 

 

同理我們刪掉erp庫下的某張表的某一行

[SQL]delete from erp_mard id=104;
受影響的行: 1
時間: 0.002s

 

 

再次執行同步校驗

[root@HE3 ~]#/usr/local/bin/pt-table-checksum h=`192.168.1.250`,u=`checksums`,p=`MANAGER`,P=3306 -d www --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format

 

 

可以發現剛剛刪除的erp_mard表已經進入到了我們的主從不一致記錄表裡

mysql> SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;
+-----+----------------+------------+--------+
| db  | tbl            | total_rows | chunks |
+-----+----------------+------------+--------+
| erp |
erp_mard       |      11183 |      1 |
| www |
decorate_order |      25356 |      1 |
+-----+----------------+------------+--------+
2 rows in set (0.02sec)

 

 

我們在主庫執行pt-table-sync命令來進行重新同步(請做好備份,重要的話說三遍,備份備份備份)



我們先利用print命令,列印出修改的語句但不執行,這裡本人推薦用print命令,篩選出需要在不同從庫執行的語句,最好不要直接excute執行
[root@HE3 ~]#/usr/local/bin/pt-table-sync --print --replicate  test.checksums  h=`192.168.1.250`,u=`sys_admin`,p=`MANAGER`


本條命令會對主庫下所有的從庫進行同步
[root@HE3 ~]#/usr/local/bin/pt-table-sync --execute --replicate  test.checksums  h=`192.168.1.250`,u=`sys_admin`,p=`MANAGER`

同步完後重新驗證

[root@HE3 ~]#/usr/local/bin/pt-table-checksum h=`192.168.1.250`,u=`checksums`,p=`MANAGER`,P=3306 -d www --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format
[root@HE3 ~]# /usr/local/bin/pt-table-checksum h=`192.168.1.250`,u=`checksums`,p=`MANAGER`,P=3306 -d erp --nocheck-replication-filters --replicate=test.checksums --no-check-binlog-format

 

可以發現checksums表已經沒有不同步的表了

mysql> SELECT db,tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks FROM test.checksums WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;
Empty set (0.03 sec)

 

 

至此主從校驗、同步完成

 

pt-table-checksum,pt-table-sync這兩個工具還有很多重要的特性和引數,這裡僅做實驗用,具體的生產還需要哪些引數,比如只同步某張表等以後會繼續深入研究