首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V4.2.1 BP7 版本转储报错 -4018 导致 clog 无法回收的原因和解决方法
更新时间:2026-06-12 08:51
问题现象
OceanBase 数据库 V4.2.1 BP7 版本发生租户的 clog 无法回收,通过 LOG_DISKUSED_PERCENTAGE 看到该租户的 LOG_DISK_IN_USE 字段值与 LOG_DISK_SIZE 字段值的比值达到了 80%(达到 80% 开始回收,但当 clog 盘达到 95% 时才不让写入),且发生转储失败,__all_virtual_compaction_diagnose_info 可以看到对应租户节点的 diagnose_info 列中有 error_no=-4018 的 mini_merge 失败。


关键日志含有 range too small, not enough rows ro split 信息,完整日志如下。
[2024-12-09 16:49:23.968380] WDIAG [STORAGE] push_range_bounds_ (ob_tx_data_memtable.cpp:724) [322204][T1002_TX_TABLE_][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9][errcode=-4018] range too small, not enough rows ro split(ret=-4018, ret="OB_ENTRY_NOT_EXIST", part_cnt=23, this={ObITable:{this:0x7faf22ff21b0, key:{tablet_id:{id:49402}, column_group_idx:0, table_type:"TX_DATA_MEMTABLE", scn_range:{start_scn:{val:1725272964925707720, v:0}, end_scn:{val:1725276208282466164, v:0}}}, ref_cnt:4, upper_trans_version:-4007, timestamp:0}, is_inited:true, is_iterating:false, pre_process_done:true, construct_list_done:true, min_tx_scn:{val:1725272965238800105, v:0}, max_tx_scn:{val:1725276208282466164, v:0}, min_start_scn:{val:1725255277815586089, v:0}, snapshot_version:{val:1725272965238800105, v:0}, inserted_cnt:19665, deleted_cnt:19643, write_ref:0, occupied_size:61849472, state:2, stat_change_ts:{frozen_time:1725276209132855, ready_for_flush_time:1725276209132944, create_flush_dag_time:1733734163967596, release_time:0}, tx_data_map:0x7f9d1ed9a060, memtable_mgr:0x7fadca2c01b0, commit_versions_serialize_size:0, row_key_array:[{rowkey:{"BIGINT":0}, obj_array:{"BIGINT":0}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}, {rowkey:, obj_array:{"NULL":"NULL"}}], tx_id_2_range:[]})
问题原因
租户的转储任务报错 -4018 而失败,无法转储将内存内的增量数据写入磁盘会导致事务日志的 checkpoint 无法更新,从而导致 clog 无法回收。而转储任务报错 -4018 的原因为 OceanBase 数据库 V4.2.1 BP7 版本的已知问题,转储任务所转储的对象为事务数据表,事务存在大量的语句回滚操作,导致 tx data 数据量膨胀,触发并行转储,但要转储的事务个数又小于并行转储的并行数,导致并行转储事务数据表任务报错 -4018 range too small, not enough rows ro split。
即当大事务场景下,如果有大量的行锁冲突,则会有极小概率会触发此问题。
问题的风险及影响
转储任务无法成功,会导致租户内存打满,clog 无法回收直至达到租户在该节点的 clog 使用上限,最终会导致租户的部分表或分区在此节点无法提供服务,若故障节点超过半数,则租户的部分表或分区会无法提供服务。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V4.2.1 BP7 版本。
解决方法及规避方式
解决方法:
轮流重启故障节点,且在重启过程中不断发起(例如两分钟一次)此租户的转储任务(
alter system minor freeze;)。重启后若观测到
gv$ob_log_stat表中对应日志流节点的end_lsn - base_lsn在减小则说明问题恢复。
规避方式:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP7 Hotfix3(oceanbase-4.2.1.7-107030032024062709)及之后版本。
尽量减少事务冲突、调大租户规格以减小发生概率。