主從複製環境中,可能有種種原因導致主、從庫資料不一致的情況,主從一致性也一直是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這兩個工具還有很多重要的特性和引數,這裡僅做實驗用,具體的生產還需要哪些引數,比如只同步某張表等以後會繼續深入研究