MySQL报错MY-013177,审计日志表定义没更新导致故障远程帮忙修复
- 问答
- 2025-12-30 23:51:51
- 3
开始)
一位客户打来紧急电话,说他们的MySQL数据库服务突然启动不了了,日志里刷了一大堆错误信息,最关键的一条是“MY-013177”,客户那边的运维人员尝试了重启服务,但问题依旧,系统卡在那里,业务完全中断了,由于他们自己搞不定,时间又非常紧迫,就通过远程连接的方式请求我们帮忙看看。

连上服务器后,我第一件事就是去查看MySQL的错误日志文件,果然,在日志的开头部分,密密麻麻地记录着启动失败的信息,我快速搜索了一下,找到了那个核心的错误代码“MY-013177”,错误信息的大意是说,在初始化审计日志插件(audit log plugin)的时候发生了严重错误,具体描述是,服务器检测到审计日志表(mysql数据库下的几个名字像audit_log_user、audit_log_filter之类的表)的结构定义(也就是表 schema)与当前MySQL服务器版本所期望的结构不匹配,日志里明确写着“表定义有误”或者“表结构过时”这样的意思,就是数据库软件本身升级了,但数据库里面存放审计日志的那几张表的结构还停留在老版本的样子,新版本的软件不认识它们了,所以启动时一检查到这个问题,就直接报错退出了。
看到这个错误,我马上询问客户最近是否对数据库进行过升级操作,客户确认说,就在前一天晚上,他们为了修复一些安全漏洞,确实将MySQL从一个小版本号(比如5.7.30)升级到了另一个小版本号(比如5.7.35),升级过程本身看起来是顺利的,没有报错,业务也正常运行了一段时间,但第二天早上例行重启服务器后,就再也起不来了,这说明问题是在升级后,但直到重启时才被触发。

原因很清楚了,这是MySQL升级后一个比较典型的问题,当MySQL服务器软件版本升级时,尤其是涉及系统表结构的变更时,通常需要运行一个叫做“mysql_upgrade”的工具,这个工具的作用就是去检查mysql系统库里的所有表(比如用户权限表、时区表,还有这里的审计日志表)的结构是否与新版本匹配,如果不匹配,它会自动执行一些SQL语句来修改这些表的结构,增加或删除某些列,以便让它们适应新版本,客户他们在升级完MySQL软件后,很可能忘记或者遗漏了执行“mysql_upgrade”这一步,审计日志表的结构还是旧的,MySQL服务器在重启初始化时,严格检查了这些表,发现对不上号,于是就抛出了MY-013177错误,并拒绝启动。
既然找到了问题的根源,修复思路就很明确了:必须手动更新那些结构过时的审计日志表,使它们符合新版本的要求,现在数据库服务完全无法启动,常规的通过命令行客户端连接进去执行SQL语句的方法行不通了,这就需要采取一些非常规的应急措施。

我的修复步骤如下:为了安全起见,我让客户确认是否有最新的数据库备份,在得到肯定答复后,我稍微放心了一些,我指导客户在MySQL的配置文件(通常是my.cnf或my.ini)中,临时增加了一行配置:audit_log = OFF,这行配置的作用是告诉MySQL服务器,在启动时完全忽略并跳过审计日志插件的加载和初始化,这样做的目的是为了“绕开”那个导致启动失败的错误点,先让数据库服务能够正常启动起来。
保存配置文件后,我们尝试启动MySQL服务,这一次,服务果然成功启动了,因为它没有再试图去检查那些有问题的审计日志表,服务启动后,我立即通过MySQL客户端连接了上去,就是要解决表结构的问题了,我没有选择直接修改表结构,而是选择先绕过这个问题,我们的目标是先让数据库服务能够正常启动起来,然后再在运行状态下从容地处理表结构升级。
配置修改保存后,我们尝试启动MySQL服务,这一次,由于跳过了审计日志插件的初始化,服务顺利地启动成功了,客户在电话那头也松了一口气,服务启动后,我立即通过MySQL客户端连接到数据库,接下来要执行关键的升级步骤,我运行了命令:mysql_upgrade -u root -p,这个工具会自动连接上正在运行的MySQL实例,扫描系统表,并对比版本差异,果然,它检测到mysql库中的那几张审计日志表需要升级,并自动执行了相应的ALTER TABLE语句来修改表结构,这个过程很快,屏幕上滚动着一些升级成功的提示信息。
在确认mysql_upgrade成功执行完毕后,最后一步是重新启用审计日志功能,我再次编辑MySQL的配置文件,将之前添加的audit_log = OFF这一行注释掉(在前面加个#号)或者直接删除,然后重启MySQL服务,这次重启,MySQL服务器再次初始化审计日志插件,但这次它检查表结构时,发现已经和新版本匹配了,于是初始化成功,服务正常启动,所有功能恢复,我让客户验证了一下业务系统,确认一切运作正常,这个紧急故障就这样被解决了。
事后,我向客户解释了整个问题的来龙去脉,并特别强调:今后在进行MySQL版本升级时,无论是大版本还是小版本升级,在更新完软件包后,一定不要忘记执行mysql_upgrade命令,这是确保系统表结构同步更新的关键步骤,可以避免很多类似MY-013177这样的潜在问题,最好能将这一步骤明确写入公司的标准化运维流程中。
结束)
本文由雪和泽于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/71555.html
