首批通过分布式安全可靠测评,为关键业务系统打造
OBServer major merge 超时,日志 Lob writer 不断报错
更新时间:2026-06-12 08:51
问题现象
-- 创建无主键的有 LOB 列的分区表
create table t("c0" NUMBER(12,0) NOT NULL, "c1" date default sysdate, "c2" CLOB, constraint "PK_LOG_0114" UNIQUE ("c0")) PARTITION BY RANGE ("c1") (PARTITION "p1" VALUES LESS THAN (TO_DATE(' 2021-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), PARTITION "pother" VALUES LESS THAN (MAXVALUE));
insert into t values(3, NULL, repeat('t', 2097152)); -- 写入足够大的 LOB 数据,同时分区键列为 NULL
alter system major freeze; -- 触发 major 转储,转储会一直无法完成,查看日志有 Lob writer 报错日志
关键诊断信息
触发条件
一个拥有分区键的无主键表,同时表中存在 LOB 列,而且分区键列可以为 NULL。分区键列写入 NULL,同时 LOB 列写入足够大的数据触发 LOB 的 outrow。
问题原因
一个拥有分区键的无主键表,同时表中存在 LOB 列,而且分区键列可以为 NULL。在无主键表场景下,分区键列会作为 Rowkey 的一部分,而且分区键列允许为空的情况下,分区键列写入 NULL,同时 LOB 列写入足够大的数据触发 LOB 的 outrow,可稳定复现此问题。 OceanBase 数据库 V3.X 版本的 LOB 在做 major 转储时,会对 row 中每列的 rowkey 进行强类型校验,这个校验由于没有规避 is_null 的逻辑,导致分区键列为 NULL 的情况下会报错,由于 type 为 NULL,不能满足 type 一致的校验,导致报错。
问题的风险及影响
特定场景下,导致 major merge 一直无法完成。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V3.2.3 BP6(oceanbase-3.2.3.3-106000102022111521)及之后版本。
规避方式
建立一张定义完全一样的表,将原表数据导入过去的同时,需要修改保证分区键列非空,然后 drop 原表,重新触发 major freeze。