首批通过分布式安全可靠测评,为关键业务系统打造
共享存储模式下合并丢数据
更新时间:2026-06-12 08:51
问题现象
共享存储模式,合并后出现查询结果丢失等正确性问题。
关键诊断信息
触发条件
LS Leader 所在的 OBServer。
同一个 Tablet,假设 LS ID = 1001,TabletID = 200001。
满足以下 TimeLine,其中,t1 和 t2 不区分先后。
| 时刻 | 线程 1 合并调度线程 | 线程 2 转储 Dag 线程 | 线程 3 SKIP MERGE DAG 线程 |
|---|---|---|---|
| t1 | 200001 发起转储 | ||
| t2 | 1001 LS Leader 轮询到 200001 | ||
| t3 | 拿到 200001 的 Tablet Handle | ||
| t4 | 200001 转储完成,从 MemTable mgr 上删除所有的已冻结 MemTable,同时 mgr 上不存在 Active MemTable | ||
| t5 | 未检查到 200001 上存在 MemTable,误判断为 Skip Merge | ||
| t6 | 写下 NO INC DATA 的 CLOG | ||
| t7 | 通过深拷旧 MAJOR 生成新 MAJOR,新 MAJOR 丢失了新写入的增量数据 |
事前巡检
无,尽快升级到带 Hotfix 的版本。
事后诊断
丢数据的分区在最近一轮合并中,走了 SKIP MERGE。
该分区对应的 Leader 在写最近一轮合并的 Medium Clog 前,有即将完成的并发转储任务,并且该转储任务在收尾阶段清空了 MemTable mgr 上所有的 Frozen MemTable,同时该 Tablet 上不存在 Active MemTable。
以下为关键日志:
LS Leader 写 clog 日志,确认该分区合并是否走 SKIP Merge。
success to submit medium compaction clog(ret=0, this={ls_id:{id:1002}, tablet_id:{id:200002}}, medium_info={compaction_type:"MAJOR_COMPACTION", merge_reason:"NO_INC_DATA", medium_snapshot:1736501947272096000写 clog 时间点附近,同一 OBServer 下,该 Tablet 是否有转储释放 MemTable。
release_head_memtable_ (ob_tablet_memtable_mgr.cpp:822) [3650161][T1002_MINI_MERG][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=15] succeed to release head data memtable(ret=0, occupy_size=180355072, memtable={ObITabletMemtable:{ObITable:{this:0xc00ab42eac0, key:{tablet_id:{id:200002}
问题原因
共享存储模式下,如果一个分区在合并前没有增量数据,那么该分区在合并时会走快速路径:Skip Merge,即直接通过旧 Major 拷贝出一个新 Major,然后完成合并。
合并前会由分区对应的 LS Leader 写 Medium Compaction Clog,并在写 clog 前判断该分区是否有增量数据:
如果一个 Tablet 上既没有 MemTable,也没有 Mini/Minor SSTable,就认为该 Tablet 上不存在增量数据,则可以走 Skip Merge。
如果一个 Tablet 存在增量数据,但又走了 Skip Merge,则会导致增量数据没有写进 Major SSTable 中,合并后使用新 Major SSTable 查询,就会丢数据。
然而在判断 Tablet 上是否有 MemTable 时误用了错误的接口,应该用 ObTablet::get_memtables 接口,而不应该用 ObTablet:get_all_memtables 接口。使用 ObTablet::get_all_memtables 接口会导致在某些情况下 Tablet 看不到 MemTable,进而导致误判断。
问题的风险及影响
SN 模式不影响,只影响 SS 模式。该问题会导致业务丢数据。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.3.5 GA(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.3.5 GA Hotfix2(oceanbase-4.3.5.0-100020012025012015)、V4.3.5 GA Hotfix3(oceanbase-4.3.5.0-100030012025020717)、V4.3.5 GA Hotfix4(oceanbase-4.3.5.0-100040012025021921)、V4.3.5 GA Hotfix5(oceanbase-4.3.5.0-100050012025022422)、V4.3.5 GA Hotfix6(oceanbase-4.3.5.0-100060022025031922)、V4.3.5 GA Hotfix7(oceanbase-4.3.5.0-100070012025040810)、V4.3.5 GA Hotfix8(oceanbase-4.3.5.0-100080012025052715)、V4.3.5 GA Hotfix9(oceanbase-4.3.5.0-100090012025063017)、V4.3.5 GA Hotfix10(oceanbase-4.3.5.0-100100032025071516)、V4.3.5 GA Hotfix11(oceanbase-4.3.5.0-100110012025072810)、V4.3.5 GA Hotfix12(oceanbase-4.3.5.0-100120012026011215)、V4.3.5 BP1(oceanbase-4.3.5.1-101000292025030623)。
规避方式
无,尽快升级到带 Hotfix 版本。