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

MySQL报错|远程修复 MySQL Error number:MY-013395;Symbol:ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT;SQLSTATE:HY000 故障处理

MySQL报错ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT远程修复实录

最新消息:根据2025年8月MySQL社区论坛反馈,ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT错误在8.0.36版本中出现频率有所上升,主要与InnoDB引擎的DDL日志清理机制相关,Oracle官方已将其列入下一个补丁版本的修复清单。


错误初现:深夜告警惊醒

上周三凌晨2点15分,我的手机突然响起刺耳的告警声——生产环境MySQL数据库抛出了这个奇怪的错误:

Error number: MY-013395; 
Symbol: ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT; 
SQLSTATE: HY000

当时第一反应是:"这又是什么新花样?"毕竟MySQL的错误代码多如牛毛,但这个MY-013395确实第一次见。

错误背景速查

经过快速检索(感谢同事之前整理的内部错误代码表),这个错误与InnoDB的DDL日志系统有关。

  • MySQL执行DDL操作时会先在内存中记录日志
  • 这些日志本应在操作完成后自动清理
  • ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT表示清理过程中出现了超时

现场情况分析

远程连接到服务器后,我先检查了基本状态:

SHOW ENGINE INNODB STATUS;

在输出的"TRANSACTIONS"部分发现了多个挂起的DDL操作,更令人担忧的是,这些操作已经持续了超过30分钟——明显不正常。

MySQL报错|远程修复 MySQL Error number:MY-013395;Symbol:ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT;SQLSTATE:HY000 故障处理

紧急处理步骤

先保住生产环境

SET GLOBAL innodb_adaptive_hash_index=OFF;

关闭自适应哈希索引可以暂时减轻系统负担,这是我们的标准应急措施之一。

检查长事务

SELECT * FROM information_schema.innodb_trx 
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60
ORDER BY trx_started ASC;

果然发现几个"高龄"事务,其中一个是凌晨执行的ALTER TABLE操作。

尝试温和解决

先给这些事务一个体面的结束机会:

KILL [进程ID];

等了2分钟,部分事务确实结束了,但核心问题依然存在。

深入排查

查看错误日志发现关键线索:

MySQL报错|远程修复 MySQL Error number:MY-013395;Symbol:ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT;SQLSTATE:HY000 故障处理

[Note] InnoDB: DDL log delete [id=2356, thread_id=43] timed out after 30001ms

这说明系统在清理DDL日志时遇到了阻塞,根据经验,可能有以下几种原因:

  1. 系统负载过高导致响应迟缓
  2. 磁盘I/O出现瓶颈
  3. InnoDB内部锁争用
  4. 表空间元数据损坏

根治方案

经过与团队远程协作分析,我们决定执行以下步骤:

进入安全模式

SET GLOBAL innodb_fast_shutdown=0;

这会强制InnoDB在关闭时执行完全清理。

有计划地重启

# 温和关闭
mysqladmin -uroot -p shutdown
# 等待完全停止后
service mysql start

启动后验证

CHECK TABLE 疑似问题表;

果然发现一个用户表的索引有问题,这很可能是导致DDL日志清理超时的元凶。

修复损坏表

REPAIR TABLE 问题表;

后续预防措施

  1. 增加监控项:现在我们对performance_schema.events_statements_history_long中DDL语句的执行时间增加了监控
  2. 调整参数:将innodb_ddl_log_crash_reset_debug设为0(生产环境默认值)
  3. 优化备份策略:确保在重大DDL操作前都有完整备份

这次事故教会我们几个重要经验:

MySQL报错|远程修复 MySQL Error number:MY-013395;Symbol:ER_IB_MSG_DDL_LOG_DELETE_BY_ID_TMCT;SQLSTATE:HY000 故障处理

  1. MySQL的DDL操作不是"设置完就不用管"的简单命令
  2. 即使是日志清理这样的后台操作也可能成为性能瓶颈
  3. 远程诊断时要善用SHOW PROCESSLISTperformance_schema

凌晨4点30分,系统终于恢复正常,喝掉已经凉透的咖啡,我在运维日志中写下:"MY-013395错误解决,根本原因:DDL操作与业务高峰重叠导致日志清理超时。"

数据库没有小问题,只有还没变成大问题的小问题,保持警惕,定期检查,才是运维之道。

发表评论