主從複製環境中,可能有種種緣由致使主、從庫數據不一致的狀況,主從一致性也一直是DBA須要關注的問題,校驗MySQL的主從一致性通常有多種工具,諸如MySQL自帶的checksum、mysqldiff、pt-table-checksum等,每種工具各有優缺,本文就pt-table-checksum工具進行介紹和記錄實驗環節。mysql
下載二進制版本的percona-toolkit工具箱sql
https://www.percona.com/downloads/percona-toolkitbash
本文用的是2.2.18版本ide
[root@HE3 ~]# tar xvf percona-toolkit-2.2.18.tar.gz工具
[root@HE3 ~]# cd percona-toolkit-2.2.18this
[root@HE3 percona-toolkit-2.2.18]# perl Makefile.PLspa
[root@HE3 percona-toolkit-2.2.18]# make && make installorm
主庫建立checksums用戶用於校驗主從是否一致xml
mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksums'@'%' IDENTIFIED BY 'MANAGER';
開始執行校驗,在校驗結束後,會在test庫下建立表名爲checksums的表用於存儲主從一致性信息get
[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這兩個工具還有不少重要的特性和參數,這裏僅作實驗用,具體的生產還須要哪些參數,好比只同步某張表等之後會繼續深刻研究