首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 集群 2.x 版本合并报错 init var row index failed 原因与解决方法
更新时间:2026-06-15 09:16
问题现象
OceanBase 2.x 集群合并时,某个表的所有副本都出现合并异常,查看合并日志,出现如下异常:
[2024-04-30 09:15:21.352346] WARN [STORAGE] init (ob_micro_block_decoder.cpp:196) [2990022][456][XXXXXXXXXXXX-XXXXXXXXXXXXXXXX] [lt=40] [dc=0] invalid argument(ret=-4002, data=0x7f1a7e81bdd5, len=282517, row_cnt=-25177, index_byte=4)
[2024-04-30 09:15:21.352368] WARN [STORAGE] do_init (ob_micro_block_decoder.cpp:543) [2990022][456][XXXXXXXXXXXX-XXXXXXXXXXXXXXXX] [lt=20] [dc=0] init var row index failed(ret=-4002, row_data=0x7f1a7e81bdd5, row_data_len=282517, header=0x7f1a7e81bdb0)
问题原因
OceanBase 集群对副本合并时默认是 encoding 模式,encoding 可以对数据进行压缩极大节省数据空间,但是某些情况下会因 OceanBase 内部缺陷导致 encoding 时异常,从而出现合并问题。
问题的风险及影响
在执行合并时,会出现合并异常,导致无法合并。
影响版本
OceanBase 数据库 V2.x 版本。
影响的租户
OceanBase 数据库 SYS 租户、MySQL 租户和 Oracle 租户。
解决方法
临时绕过方案:修改
_force_skip_encoding_partition_id参数,使 OceanBase 在做 enconding 时绕过该副本,该方案只是应急,应急结束需要将参数改为空,另外,绕过之后后续合并大概率会再次出现此类问题。alter system set _force_skip_encoding_partition_id = '0@1100611139453888';彻底解决方案
升级 OceanBase 数据库 V2.2.77 至最新版本或 V3.x、V4.x 等最新版本。
单独设置该表不使用 encoding 模式,方法步骤如下:
新建一个临时表 b,不同租户类型的建表不同,参考如下:
MySQL 租户Oracle 租户表结构语句里的
ROW_FORMAT设置为compact,即可关闭该表的 encoding 模式:CREATE TABLE `antest` ( `USER_ID` varchar(14) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '' ) DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = compact;表b的表结构语句里的
compress设置为nocompress,即可关闭该表的 encoding:CREATE TABLE "TBL3" ( "COL1" NUMBER(38), "COL2" VARCHAR2(50) ) nocompress;通过
insert into table_b select * from table_a的方式,将数据写入表 b,建议分批,单次写入 100w 左右数据,避免大事务对 V2.x 版本的影响。数据写入表 b 后,确认表 b 数据可用,可删除表 a 或者重命名表 a 为表 c。
确认表 b 数据可用后,将表 b 重命名成表 a,如果第 3 步重命名为表 c,则需要删除表 c。