当前位置:首页 > 问答 > 正文

MySQL报错MY-013103,二进制日志行值选项只能用于after images,远程帮忙修复问题

MySQL数据库在运行过程中,有时会在错误日志里突然出现一个编号为MY-013103的警告或错误信息,这条信息的具体文字通常是:“MY-013103 - The row value option for the binary log can only be used with after images. It is necessary to adjust the server configuration。”

要弄懂这个问题,我们得先简单了解两个背景知识,第一个是“二进制日志”,这是MySQL的一个核心功能,你可以把它想象成数据库的“操作记录仪”或“流水账本”,它会把数据库里所有更改数据的操作,比如增删改,都按顺序详细地记录下来,这个日志主要有两个大用途:一是主从复制,就是让一个主数据库的改动自动同步到多个从数据库;二是数据恢复,万一哪天数据被误删了,可以靠回放这个日志把数据找回来。

第二个背景知识是“行映像”,当二进制日志要记录一条修改语句时,它有两种方式来记录,一种是记录整个SQL语句本身,这叫“基于语句的复制”,比如你执行了UPDATE users SET name='张三' WHERE id=1;,日志就原样记下这条命令,另一种更精细的方式是记录数据行在修改前和修改后具体的变化,这叫“基于行的复制”,这里面就涉及到“前映像”和“后映像”。“前映像”指的是这条记录在修改之前的样子,也就是旧数据;“后映像”指的是修改之后的新样子,也就是新数据。

我们回到报错信息本身,错误信息非常明确地指出:“二进制日志的行值选项只能用于后映像”,这句话的意思是,你在MySQL的配置文件里,可能是my.cnfmy.ini,设置了一个叫做binlog_row_value_options的参数,这个参数是专门用来控制,在使用基于行的复制时,如何更高效地记录“后映像”的,它提供了一些高级选项,比如PARTIAL_JSON,这个选项特别智能,当你只更新了一个巨大的JSON文档中的一小部分字段时,它可以只记录那部分发生了变化的字段,而不是把整个JSON文档都记录到日志里,从而大大节省了日志空间和网络传输量。

问题就出在这里,你设置的binlog_row_value_options这个参数,它的设计初衷和工作范围,仅仅是为了优化“后映像”的记录方式,你的服务器配置中,可能同时开启了另一个要求记录“前映像”的功能,什么情况下需要记录“前映像”呢?一个最常见的场景就是,你为某个数据表定义了主键约束,在主从复制过程中,为了确保数据的一致性,当从库要应用一条更新或删除操作时,它需要准确地找到主库上被改动的那一行数据,如果表有主键,那么用主键值来定位是最准确高效的,这个用于定位的主键信息,恰恰就是从“前映像”中获取的。

矛盾的根源就清晰了:你的配置一方面通过binlog_row_value_options告诉MySQL:“请用那种高级的、只记录部分JSON变更的模式来处理后映像”;但另一方面,因为表有主键,复制机制又要求必须完整地记录“前映像”(至少包含主键信息),而那种高级的部分记录模式并不适用于“前映像”,MySQL的日志系统在处理这个冲突时犯了难,它发现无法用只记录部分数据的方式去满足必须完整记录前映像的要求,于是就只能抛出MY-013103这个错误,并停止后续可能导致问题的操作。

如何远程修复这个问题呢?修复的核心思路就是解决这个配置冲突,让记录“前映像”的要求和记录“后映像”的方式能够和谐共处,根据具体情况,通常有以下几种处理办法:

第一种办法,也是最直接、最推荐的解决办法,就是检查并修改binlog_row_value_options这个参数的设置,你需要登录到出问题的MySQL服务器上,查看当前的配置,可以通过SQL命令SHOW VARIABLES LIKE 'binlog_row_value_options';来查看它当前的值,很可能它被设置成了PARTIAL_JSON,解决方法是编辑MySQL的配置文件,找到binlog_row_value_options这一行,要么将它直接注释掉(行首加号),要么将它修改为一个空值,修改完成后,必须重启MySQL服务才能使新的配置生效,重启之后,MySQL在记录二进制日志时就不再试图对“前映像”使用部分JSON更新这种不兼容的模式了,错误自然就会消失,这是最根本的解决之道。

第二种办法,是一个变通的方案,但需要你非常清楚其后果,你可以尝试强制让MySQL在记录行数据时,不记录“前映像”,这是通过设置另一个参数binlog_row_imageMINIMAL来实现的。MINIMAL模式的意思是,只记录识别一行数据所必需的唯一标识(比如主键)和那些实际被更改了的列,这样做有一个巨大的风险:如果你的表没有定义主键,那么MINIMAL模式可能无法为从库提供足够的信息来定位要修改的行,极易导致主从复制数据不一致,这是非常危险的情况,除非你百分百确定所有需要复制的表都有合适的主键,并且完全了解潜在风险,否则强烈不建议普通用户采用这种方法。

第三种情况,相对少见但也有可能,那就是你的binlog_row_value_options参数设置本身没有错,但它可能与某个特定版本的MySQL存在兼容性问题,在排查时,也应该确认一下你的MySQL版本,如果版本较旧,考虑在业务低峰期将其升级到一个更新的稳定版本,有时也能间接解决这个bug。

遇到MY-013103错误不要慌,它本质上是一个配置上的逻辑冲突,绝大多数情况下,问题就出在binlog_row_value_options这个参数被设置为了PARTIAL_JSON,而你的数据库环境又需要记录完整的前映像,最安全、有效的修复步骤就是:登录服务器 -> 检查配置文件 -> 注释或清空binlog_row_value_options的设置 -> 重启MySQL服务,在修改任何数据库配置之前,牢记备份配置文件是一个必须养成的好习惯,这样,即使修改后出现问题,也能迅速回滚到原始状态。

MySQL报错MY-013103,二进制日志行值选项只能用于after images,远程帮忙修复问题