基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建局部索引报错-4016
更新时间:2026-08-18 03:21
问题现象
当租户参数 _enable_decimal_int_type 设置为 false,且主表为已包含数据的分区表时,执行创建局部索引的 SQL 语句会失败,并返回错误码 4016。
问题原因
OceanBase 内核存在一个缺陷:当 _enable_decimal_int_type 参数为 false 时,在创建局部索引的过程中,计算主表行数的代码路径未能正确处理 number 类型字段的运算结果,导致执行失败。
此问题仅在以下两个条件同时满足时触发:
- 主表为分区表且表中已存在数据。
- 租户级隐藏参数
_enable_decimal_int_type的值为false。
关键信息
- 错误码:-4016
- 关键日志:
get unexpected obj type(ret=-4016, result_obj.get_type()=15) - 触发条件:
- 租户参数
_enable_decimal_int_type = false - 对已存有数据的分区表执行创建局部索引的操作
- 租户参数
问题的风险及影响
创建索引的 DDL 操作会持续失败,可能导致依赖该操作的上层业务流程(例如通过 OMS 进行的数据同步)中断。
适用版本
- 影响版本:OceanBase 数据库 V4.3.5(oceanbase-4.3.5.0-100000122024123020) 及 V4.4.x 系列版本。
解决方法
方法一:临时修改参数(推荐)
此为临时应急方案,操作步骤如下:
- 将当前用户租户的隐藏参数
_enable_decimal_int_type设置为true。
ALTER SYSTEM SET _enable_decimal_int_type = true TENANT = 'your_tenant_name';
- 重新执行之前失败的创建局部索引的 SQL 语句。
- 索引创建成功后,可根据业务需要,将
_enable_decimal_int_type参数改回false。
ALTER SYSTEM SET _enable_decimal_int_type = false TENANT = 'your_tenant_name';
方法二:修改索引类型
将需要创建的局部索引改为全局索引。由于该内核缺陷仅在创建局部索引时触发,使用全局索引可以规避此问题。
规避方式
- 在
_enable_decimal_int_type参数为false的租户中,对于分区表,建议优先使用全局索引,避免创建局部索引。 - 如果业务必须使用局部索引,建议在创建索引前,先将
_enable_decimal_int_type参数临时设置为true,待索引创建完成后再恢复为原值。