设为首页 收藏本站
查看: 519|回复: 0

[经验分享] MySQL主从同步校验与重新同步

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-11 09:32:00 | 显示全部楼层 |阅读模式
主从复制环境中,可能有种种原因导致主、从库数据不一致的情况,主从一致性也一直是DBA需要关注的问题,校验MySQL的主从一致性一般有多种工具,诸如MySQL自带的checksum、mysqldiff、pt-table-checksum等,每种工具各有优缺,本文就pt-table-checksum工具进行介绍和记录实验环节。

下载二进制版本的percona-toolkit工具箱
https://www.percona.com/downloads/percona-toolkit

本文用的是2.2.18版本
[iyunv@HE3~]# tar xvf percona-toolkit-2.2.18.tar.gz
[iyunv@HE3~]# cd percona-toolkit-2.2.18
[root@HE3percona-toolkit-2.2.18]# perl Makefile.PL
[iyunv@HE3 percona-toolkit-2.2.18]# make && make install


主库创建checksums用户用于校验主从是否一致
1
mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksums'@'%' IDENTIFIED BY 'MANAGER';



开始执行校验,在校验结束后,会在test库下创建表名为checksums的表用于存储主从一致性信息
1
[iyunv@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来查看哪些表有主从不一致的情况,此时主从是一致的所以没有结果
1
2
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库下的某张表的某一行

1
2
3
[SQL]delete from decorate_order where id=10;
受影响的行: 1
时间: 0.003s






再次运行同步校验
1
[iyunv@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可以看到主从不一致的表名
1
2
3
4
5
6
7
8
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库下的某张表的某一行
1
2
3
[SQL]delete from erp_mard id=104;
受影响的行: 1
时间: 0.002s






再次运行同步校验
1
[iyunv@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表已经进入到了我们的主从不一致记录表里
1
2
3
4
5
6
7
8
9
10
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命令来进行重新同步(请做好备份,重要的话说三遍,备份备份备份)


1
2
3
4
5
6
我们先利用print命令,打印出修改的语句但不执行,这里本人推荐用print命令,筛选出需要在不同从库执行的语句,最好不要直接excute执行
[iyunv@HE3 ~]#/usr/local/bin/pt-table-sync --print --replicate  test.checksums  h='192.168.1.250',u='sys_admin',p='MANAGER'


本条命令会对主库下所有的从库进行同步
[iyunv@HE3 ~]#/usr/local/bin/pt-table-sync --execute --replicate  test.checksums  h='192.168.1.250',u='sys_admin',p='MANAGER'





同步完后重新验证
1
2
[iyunv@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
[iyunv@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表已经没有不同步的表了
1
2
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这两个工具还有很多重要的特性和参数,这里仅做实验用,具体的生产还需要哪些参数,比如只同步某张表等以后会继续深入研究





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256257-1-1.html 上篇帖子: mariadb 5.5.50 default-storage-engine 下篇帖子: MySQL 表空间传送
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表