问题现象
Oracle 租户下,数据表为分区表并包含 CLOB 类型字段,其中部分行数据超过 1.5M 溢出至行外存储,因此所有包含投影 CLOB 列的语句都会报错,报错码 -4016、-4201 等,根据不同的导入方式或查询语句,都可能产生。
示例如下,查询分区表 t1 报错。
obclient> SELECT ROWID AS "_ODC_INTERNAL_ROWID_",msg_serial_num,msg_type,biz_status,recver,sender,key_data_summary,err_info,related_msg_serial_num,src_trade_num,msg_content,biz_date,input_tm,update_tm,input_oper_num,input_oper_name,update_oper_num,update_oper_name from t1 where msg_serial_num = '123';
ORA-00600:internal error code,arguments:-4016,Internal error
问题原因
OceanBase 数据库 V3.2.X 版本,存储做了分区级 rescan 的性能优化,支持在分区间共享查询迭代器,减少重新构造的开销。但在此处遗漏了 lob 迭代器的刷新, lob 的读取强依赖 SSTable 结构,迭代器无法直接重用, 需要使用新分区对应 SSTable 信息重新初始化。
问题的风险及影响
根据上述原因, 分区表叠加需要溢出存储的大对象时就可能产生问题。
影响的版本
OceanBase 数据库 V3.2.3、V3.2.4 版本
解决方法及规避方式
升级到 OceanBase 数据库 V3.2.3 BP7 Hotfix2、V3.2.4 BP3 及以上版本。