首批通过分布式安全可靠测评,为关键业务系统打造
大分区合并写 slog 超限失败
更新时间:2026-07-24 10:01
问题现象
合并超时,定位到部分超大分区的合并失败,报 4019 错误。
关键诊断信息
触发条件
单分区 SSTable 的数据量大于 2T 以上。
事前巡检
用以下 SQL 定位超大 SSTable。输出行均有可能触发上述问题的分区。
obclient> select * from oceanbase.__all_virtual_meta_table where required_size > 2000000000000;
obclient> select * from oceanbase.__all_virtual_table_mgr where size > 2000000000000;
事后诊断
类似下面的 slog 申请单条日志长度超限报错,error 级别日志。
[2024-03-20 17:07:09.886052] ERROR [STORAGE.REDO] get_log_item (ob_storage_log_writer.cpp:355) [1830476][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=7] [dc=0] log item too long(ret=-4019, total_item_size=34488320, ObLogConstants::LOG_ITEM_MAX_LENGTH=33554432) BACKTRACE:0xf51213f 0x50e752f 0x5237933 0x523756f 0x52372d3 0x523b2f9 0xaaaaf75 0xaaa958b 0xaa8d647 0xaa89d3c 0xaa892e9 0xaa88aaf 0x9d55082 0x9d56ef6 0x9db2380 0x9db348d 0xa6aad07 0x9ffd690 0xa0096bf 0xa0083aa 0x67f1bd7 0x5116df4 0x65b657e 0xf3f1613 0xf3f146f 0xf68ffff
问题原因
SSTable 的生成过程中,会写一条元数据日志。该日志中记录了这个 SSTable 包含的所有数据宏块 ID 的列表。已知单条 slog 的最大长度是 32MB,一个宏块 ID 的长度是 32 字节,使用变长序列化(在磁盘上的长度小于等于 32 字节)。因此 32MB 的 slog 日志保守能写入 32MB / 32B = 1M 个宏块,每个宏块的最大数据长度是 2MB,最终保守支持的最大单分区上限为 2TB。
问题的风险及影响
租户下的转储或是合并失败。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
说明
- OceanBase 数据库 V2.x 和 V3.x 的所有版本,都有单分区上限。即 V2.2.77 版本,V3.1.2 版本,V3.1 CE 版本,V3.2.3 版本,V3.2.4 版本。
- OceanBase 数据库 V2.x 版本建议单分区在 2TB 以下,V3.x 版本建议单分区在 1TB 以下,均作为已知的存储边界。
- OceanBase 数据库 V4.x 版本后,不存在上述边界限制。
解决方法
truncate 清理数据。
将部分数据导入到新表后重命名替换原表,删除老表。
规避方法
设置大分区巡检,提前对大数据量单分区做拆分,或清理数据。