MySQL 不同复制模式下,如何忽略binlog事件

默北 MySQL1 9,5051字数 1682阅读5分36秒阅读模式

在MySQL复制中,如果slave节点上遇到错误,比如数据不存在或者主键冲突等错误时,想要忽略这些错误,可以采用以下几种方法:

1、未启用GTID模式时

只需通过设定 SQL_SLAVE_SKIP_COUNTER 的值,即可忽略一些复制事件。例如:文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

#需要先关闭SLAVE服务
root@imysql.com [test]> STOP SLAVE;文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

#忽略N个事件(event),通常一个SQL是一个事件
root@imysql.com [test]> SET SQL_SLAVE_SKIP_COUNTER=N;文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

#再次启动SLAVE服务
root@imysql.com [test]> START SLAVE;文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

2、启用GTID模式时

启用GTID,想要忽略某些错误事件就稍微麻烦一点点了。
首先,我们需要先查看当前SLAVE复制的进度:文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

mysql> SHOW SLAVE STATUS\G文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

从中看到,当前SLAVE复制的GTID进展是:文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: …Duplicate…key ‘PRIMARY’, Error_code: 1062;…
Master_UUID: f2b6c829-9c87-11e4-84e8-deadeb54b599
Retrieved_Gtid_Set: 3a16ef7a-75f5-11e4-8960-deadeb54b599:1-283,f2b6c829-9c87-11e4-84e8-deadeb54b599:1-33
Executed_Gtid_Set: 3a16ef7a-75f5-11e4-8960-deadeb54b599:1-283,f2b6c829-9c87-11e4-84e8-deadeb54b599:1-31
Auto_Position: 1文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

从上面的信息可以看到,当前从MASTER取到了1-33的事务列表,并且已执行(看Executed_Gtid_Set)到了31这个事务GTID位置,在这下一个位置(32)上发生错误。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

这时候,我们需要手工调整SLAVE已清除的GTID列表 GTID_PURGED,人为通知SLAVE哪些事务已经被清除了,后续可以忽略:文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

root@imysql.com [test]> STOP SLAVE;
root@imysql.com [test]> RESET MASTER;
root@imysql.com [test]> SET @@GLOBAL.GTID_PURGED = “3a16ef7a-75f5-11e4-8960-deadeb54b599:1-283,f2b6c829-9c87-11e4-84e8-deadeb54b599:1-32”;
root@imysql.com [test]> START SLAVE;文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

上面这些命令的用意是,忽略 f2b6c829-9c87-11e4-84e8-deadeb54b599:32 这个GTID事务,下一次事务接着从 33 这个GTID开始,即可跳过上述错误。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

3、无论是否启用GTID,使用pt-slave-restart工具

首先不得不说,percona toolkit工具集对DBA而言实在太方便了。pt-slave-restart工具的作用是监视某些特定的复制错误,然后忽略,并且再次启动SLAVE进程(Watch and restart MySQL replication after errors)。
简单用法示例:文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

#忽略所有1062错误,并再次启动SLAVE进程
[yejr@imysql.com ]# pt-slave-resetart -S./mysql.sock —error-numbers=1062文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

#检查到错误信息只要包含 test.yejr,就一概忽略,并再次启动 SLAVE 进程
[yejr@imysql.com ]# pt-slave-resetart -S./mysql.sock —error-text=”test.yejr”文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

综上,我们虽然可以利用工具来快速忽略复制错误,但还是要掌握如何人为忽略复制错误的方法,在没有工具的时候也能了然于胸。文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/ 文章源自运维生存时间-https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 28/03/2017 10:14:53
  • 转载请务必保留本文链接:https://www.ttlsa.com/mysql/mysql-how-to-ignore-binlog-events-in-different-replication-modes/
评论  1  访客  1
    • 匿名
      匿名 0

      大哥你在逗我吗?reset master?主库日志全不要了?

    评论已关闭!