诺亚方舟

沉淀

记录一起线上mysql binlog格式转换

前段时间在调研canal的使用,这个玩意的原理是基于binlog的订阅,交由客户端完成事务操作,其中,canal的使用要求数据源日志格式需要使用row模式。我们线上数据库是用的主从读写分离的架构,查了下,线上主库从库使用的都是mixed模式,而这次的调整并不想动到主库15,担心影响业务,因此选择了使用从从库68订阅。眼下要搞清楚的问题就是能否单独修改68的binlog格式,而不需要动15的格式?一开始直接修改68上的binlog格式,命令行下查询设置成功,但是实际上binlog还是以mixed格式存在,这一度让我怀疑是不是从库的binlog就是从主库同步过来的binlog(mixed格式)+从库自身的binlog(row格式)这样组合,那是不是要改主库格式才能完成?后来冷静想了一下主从同步的原理,不对,从库从主库拉取到的是relay-log,跟自身的binlog应该是两份,那问题重点还是在于为什么从库设置binlog格式无法正式生效?直到后来查阅资料从库里的binlog格式修改除了通过命令行修改格式外还需要重启15和68之前的主从,即stop slave,start slave,这样才解决这个问题。

 

思考:这种操作的好处是需要增加一些后端异步任务时可以直接订阅从库日志,无需影响到主库和线上业务,坏处在于只要68从库断了,这个异步服务也会订阅不到相关日志,导致连锁故障,因此如果是重要的异步服务,还是要直接从主库15订阅的靠谱。

灵感来自:MySQL主从在线修改binlog格式从STATEMENT更改成ROW格式

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>