首批通过分布式安全可靠测评,为关键业务系统打造
Minor/Mini SSTable 的 UPPER_TRANS_VERSION 长时间算不出来
更新时间:2026-06-12 08:51
问题现象
有多个 SSTable 的 UPPER_TRANS_VERSION 是最大值,但是右边界距离当前时间已经比较遥远,就可能有问题。
关键诊断信息
触发条件
日志流做一次迁移。
对迁移后日志流。
开个事务。
在某个 Tablet 上产生少量写入。
做一次冻结转储,产生一个转储未提交的 SSTable。
事务提交。
后续不再写该 Tablet,其不会被 MinorMerge 碰到。
等待数小时,能观察到该 Tablet 存在一个有未提交行的 SSTable,且
UPPER_TRANS_VERSION持续算不出来。
事前巡检
通过如下 SQL 可以找到一些 UPPER_TRANS_VERSION 没算出来,且 end_log_scn 很老的 SSTable。
select svr_ip, svr_port, table_type, tenant_id, ls_id, tablet_id, size, usec_to_time(END_LOG_SCN/1000), (CONVERT(UNIX_TIMESTAMP(NOW(6)) * 1000000, UNSIGNED) - (END_LOG_SCN/1000))/1000/1000 as end_scn_gap_seconds from gv$ob_sstables where TABLE_TYPE != 'MEMTABLE' and UPPER_TRANS_VERSION = 9223372036854775807 and (CONVERT(UNIX_TIMESTAMP(NOW(6)) * 1000000, UNSIGNED) - (END_LOG_SCN/1000))/1000/1000 > 3600 * 24 * 2 order by end_scn_gap_seconds desc;
如下图所示。有很多 SSTable。

事后诊断
对存在长时间算不出来 SSTable 的租户做一次租户级冻结,等待一段时间(十分钟左右),观察 SSTable 是否有算出 UPPER_TRANS_VERSION。若仍然算不出来,大概率遇到了此问题。
问题原因
内核 BUG,UPPER_TRANS_VERSION 计算逻辑被错误关闭且没有打开。
问题的风险及影响
初期不会有明显影响,长时间跑下去可能导致磁盘 IO 压力过大,进而导致转储问题、性能抖动等。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本。
解决方法
解决方法一:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.5 BP2 Hotfix3(oceanbase-4.2.5.2-102030052025032518)版本、V4.2.5 BP2 Hotfix4(oceanbase-4.2.5.2-102040012025050823)版本、V4.2.5 BP2 Hotfix5(oceanbase-4.2.5.2-102050032025060612)版本、V4.2.5 BP2 Hotfix6(oceanbase-4.2.5.2-102060012025101315)版本、V4.2.5 BP3(oceanbase-4.2.5.3-103000142025033110)及之后版本。
解决方法二:
先尝试触发对应租户的租户级冻结。
obclient> ALTER SYSTEM MINOR FREEZE TENANT mysql;等待冻结结束后大概再过十分钟,继续观察,若仍存在
UPPER_TRANS_VERSION为最大值,且右边界偏老的的 SSTable,说明没法通过转储恢复,必须要做以下的操作。重启算不出来
UPPER_TRANS_VERSION的机器(较重)。假设 1001 日志流上有 SSTable 的
UPPER_TRANS_VERSION算不出来,随便找个 1001 日志流上的数据量少的 Tablet,做一次手动 transfer,利用 transfer 本身的 disable 和 enable 能力,将UPPER_TRANS_VERSION计算重新打开(相对轻量)。对算不出来
UPPER_TRANS_VERSION的 tablet 做少量写入,确保写入事务已提交后触发冻结和全量 MinorMerge,此时 SSTable 的右边界会推大,所有行能回填版本号,UPPER_TRANS_VERSION就算出来了(比较 trick,可以不走 transfer,但会受到存储写放大系数限制,不一定有用)。
规避方式
尽量少触发迁移和 Rebuild。