首批通过分布式安全可靠测评,为关键业务系统打造
开启 TDE 后合并报错 -4334
更新时间:2026-06-12 08:51
问题现象
开启 TDE 或修改加密算法后合并 OR 查询报错 -4334。
关键诊断信息
触发条件
主表有索引,开启 TDE 或修改加密算法。
事前巡检
SELECT
t.table_id,
CASE
WHEN s.has_decrease THEN 'NOT INCREASING'
ELSE 'INCREASING'
END AS status
FROM (
SELECT DISTINCT table_id
FROM __all_virtual_table
WHERE tenant_id = XXX
) t
LEFT JOIN (
SELECT
table_id,
MAX(CASE WHEN progressive_merge_round < prev THEN 1 ELSE 0 END) AS has_decrease
FROM (
SELECT
table_id,
progressive_merge_round,
LAG(progressive_merge_round) OVER (PARTITION BY table_id ORDER BY gmt_create) AS prev
FROM __all_virtual_table_history where tenant_id = XXX
) sub
GROUP BY table_id
) s ON t.table_id = s.table_id
WHERE s.has_decrease = 1;
上述 SQL 会查找 progressive_merge_round 出现回退的表,出现这种情况说明有 DDL 操作没有按预期推高 table schema 的 progressive_merge_round,但不一定会引发问题。 下面这条 SQL 可以根据第一条 SQL 查到的 table id 进行二次确认,观察 progressive_merge_round 是否确实有回退了:
SELECT gmt_create, gmt_modified, table_id, encryption, progressive_merge_round
FROM __all_virtual_table_history
WHERE tenant_id = XXX AND table_id = XXX
ORDER BY gmt_create;
事后诊断
合并卡,__all_virtual_dag_warning_history 的 diagnose info 列里有 -4334 的报错。
问题原因
开启 TDE 后需要修改主表和索引表的 table schema,将 progressive_merge_round 推高,存储感知到表的 schema 的 progressive_merge_round 被推高后,就会开启新一轮的渐进合并。渐进合并开启后不会走微块重用。 然而,开启加密/修改加密算法的 DDL 语句在实现上一直存在问题:索引表 schema 的 progressive_merge_round 不会按照预期推高,反而会出现回退,这就破坏了渐进合并强依赖的一个假设:即任何涉及到数据重写的 DDL 都需要推高 progressive_merge_round。这个问题会让合并无法按预期走渐进合并,反而走了支持微块重用的增量合并,导致合并在打开宏块做重写时,与增量数据无交叉的微块走了重用,有交叉的微块则使用新的加密算法被重写了一遍,最终导致一个宏块同时包含了使用了不同加密算法的微块,后续再读这个宏块就会出现 -4334 问题,即宏块不能自解释了。
OceanBase 数据库 V4.3.3 之前版本中没有该问题,因为任何 DDL 变更都会推高表的 schema version,在 V4.3.3 之前版本的合并逻辑中,只要 schema version 发生变化,都不会重用微块,所以即使加密后没走渐进合并,重写微块也能保证一个宏块中不会出现加密算法不同的微块。 而在 V4.3.3 之后版本,为了优化旁路导入后列存合并的性能,合并放开了 schema version 变化后微块必须重写的限制,这才导致 TDE 一直没有推 merge round 的问题被发现。
问题的风险及影响
合并失败,查询报错,数据不可读。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.3.3 GA Hotfix1(oceanbase-4.3.3.0-100000412024101200)及之后版本、V4.3.5 GA(oceanbase-4.3.5.0-100000232024123020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.3.5 GA Hotfix8(oceanbase-4.3.5.0-100080012025052715)版本、V4.3.5 BP1 Hotfix5(oceanbase-4.3.5.1-101050012025042323)版本、V4.3.5 BP2(oceanbase-4.3.5.2-102000162025051417)及之后版本。
只有索引表会有问题,需要删除索引。
规避方式
建表后先开启 TDE,再写数据。
开启 TDE 后,设置表的
progressive_merge_round = 1,走一次全量合并。