首批通过分布式安全可靠测评,为关键业务系统打造
OBServer major 合并超时
更新时间:2024-01-22 01:56
问题现象
创建无主键的有 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));
写入足够大的 LOB 数据,同时分区键列为 NULL。
insert into t values(3, NULL, repeat('t', 2097152));
触发 major 转储,转储会一直无法完成,查看日志有 LOB writer 报错日志。
alter system major freeze;
问题原因
一个拥有分区键的无主键表,同时表中存在 LOB 列,而且分区键列可以为 NULL。在无主键表场景下,分区键列会作为 Rowkey 的一部分,而且分区键列允许为空的情况下,分区键列写入 NULL,同时 LOB 列写入足够大的数据触发 LOB 的 outrow,可稳定复现此问题 。 OceanBase 数据库 V3.X 版本的 LOB 在做 major 转储时,会对 row 中每列的 rowkey 进行强类型校验,这个校验由于没有规避 is_null 的逻辑,导致分区键列为 NULL 的情况下会报错,由于 type 为 NULL,不能满足 type 一致的校验,导致报错。
问题的风险及影响
特定场景下,导致 major merge 一直无法完成。
影响的版本
OceanBase 数据库 V3.X 所有版本。
解决方法及规避方式
建立一张定义完全一样的表,将原表数据导入,同时需要修改保证分区键列非空,然后 drop 原表,重新触发 major freeze。