MySQL主從同步校驗與從新同步

主從複製環境中,可能有種種緣由致使主、從庫數據不一致的狀況,主從一致性也一直是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這兩個工具還有不少重要的特性和參數,這裏僅作實驗用,具體的生產還須要哪些參數,好比只同步某張表等之後會繼續深刻研究

相關文章
相關標籤/搜索