背景
2026 年 3 月 6 日,一台由 PmaControl 监控的 MariaDB 10.11.15 生产服务器发生了一起重大事故。与典型的崩溃(OOM、段错误)不同,这次事故呈现了独特的症状:
RocksDB: Error opening instance, Status Code: 2,
Status: Corruption: truncated record body
Incorrect information in file: './pmacontrol/ts_value_general_int.frm'
Can't init tc log
Aborting
服务器在稳定之前循环重启了数次,多个时间序列表出现 .frm mismatch 错误。
MDEV-39044 工单
经过调查,我们将此事故与 MariaDB 工单 MDEV-39044 关联起来:
ALTER 工作负载期间/之后重启导致的 MyRocks 损坏:Corruption: truncated record body,.frm mismatch,无崩溃日志,无 OOM killer
工单描述的内容
该工单记录了一个可复现的损坏场景:
- 大型分区 RocksDB 表 ——正是 PmaControl 用于指标的内容(按天分区的
ts_value_*表) - 写入负载下的
ALTER TABLE——在应用程序持续写入时添加分区 - 同时的 InnoDB 内存压力 ——InnoDB 和 RocksDB 表共存于同一台服务器
- 无内核追踪 ——无 OOM killer、无段错误、无崩溃日志
为什么如此隐蔽
该工单最危险的方面:在此场景中,没有崩溃日志是预期行为。服务器重启,执行 InnoDB crash recovery,但 RocksDB 元数据已损坏(.frm mismatch)。
一个只检查 journalctl 或 dmesg 的 DBA 什么也找不到。他们会将该事故归类为"原因不明的重启"然后继续前进。
我们的具体案例
受影响的表
所有有大量日写入的分区 RocksDB 表:
ts_value_general_int——整数指标(状态变量、计数器)ts_value_general_json——复杂的 JSON 指标ts_mysql_digest_stat——查询统计(摘要)ts_value_general_text——文本指标ts_value_slave_int——复制指标ts_value_slave_text——详细的复制状态
可能的触发条件
PmaControl 自动维护这些表上的分区:添加次日分区,删除过期分区。这些是对数十 GB 重量级表执行的 ALTER TABLE ... ADD PARTITION / DROP PARTITION 操作,同时采集 worker 持续写入(每个被监控服务器每 10 秒一次)。
内存压力信号
在崩溃之前,MariaDB 日志显示:
InnoDB: Memory pressure event disregarded
MDEV-39044 工单明确引用此模式为一个加重因素。InnoDB 内存压力不会直接导致损坏,但它创建了 RocksDB DDL 变为非原子性的上下文。
PmaControl 如何检测到事故
- 运行时间重置 通过
ts_variable.uptime时间序列在 10 秒内检测到 - Telegram 告警 立即发送
- 自动关联 错误日志:检测到
crash recovery+truncated record body签名 - 回溯分析:前一个小时的指标(线程、内存、CPU)正常——确认这不是典型的负载问题
建议
立即行动
-
不要在写入负载下对 RocksDB 表执行 DDL。将
ALTER TABLE ... ADD/DROP PARTITION安排在低活动时段。 -
监控错误日志中的
.frm错误。这是 DDL 后损坏的第一个指标。 -
关注 MDEV-39044 工单 等待官方修复。
结构性行动
-
分离引擎:如果可能,不要在同一台服务器上混合使用 InnoDB 和 RocksDB 来处理关键表。
-
考虑将热表迁移到 InnoDB。RocksDB 在顺序写入方面表现出色,但其 DDL 操作在负载下不是原子性的。
-
合理分配内存 以避免加重问题的 InnoDB 压力。参阅我们关于 OOM killer 的文章了解最坏情况的计算。
这不是什么
- 这不是硬件问题(磁盘、内存)
- 这不是 MySQL 配置问题(参数是正确的)
- 这不是可按需复现的(这是 RocksDB/DDL 引擎中的竞态条件)
这是一个由 MariaDB 自己记录的引擎缺陷。
结论
MDEV-39044 提醒我们,在生产工作负载上使用替代存储引擎(RocksDB、TokuDB)需要对 DDL 保持特别的警惕。没有崩溃日志不意味着没有损坏。
PmaControl 通过 uptime 监控 + 错误日志关联来检测这些事故,而标准工具什么也看不到。
评论 (0)
暂无评论。
发表评论