基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
转储
更新时间:2026-06-27 14:52:10
转储包含三个过程:Mini Compaction、Mini Minor Compaction 和 Minor Compaction。
Mini Compaction
当 MemTable 的大小超过一定的阈值时,需要将 MemTable 中的数据转存到 Mini SSTable 中以释放内存,该过程称为 Mini Compaction。
Mini Compaction 的核心就是释放内存和数据日志。内存中的 Frozen MemTable 通过 Mini Compaction 变成磁盘上的 Mini SSTable,是数据日志的一个 checkpoint。Mini Compaction 结束后,其对应的 Frozen MemTable 和 Log 可以被释放。
Mini Minor Compaction
随着用户数据的写入,Mini SSTable 的数量会逐渐增多,在查询时需要访问的 Mini SSTable 数量就会增多,会影响查询的性能。Mini Minor Compaction 就是将多个 Mini SSTable 合成一个 Mini SSTable,其主要目的是减少 Mini SSTable 的数量。

Minor Compaction
随着 Mini SSTable 的数量越来越多,当 Mini SSTable 的数量超过阈值时,后台会自动触发 Minor Compaction,将若干个 Mini SSTable 与 Minor SSTable 合成一个新的 Minor SSTable。

Queuing 表转储
在 LSM Tree 架构下,对数据行的删除并不是原地删除,而是通过写入一行 Delete 操作(tombstore)来标记删除,如果某个用户业务表主要操作为频繁的插入与删除,从绝对数据量上来看可能并不大,但是由于 LSM Tree 的架构特征,会导致对这类表的增量数据中存在大量的 Delete 标记, 即使用户的实际扫描范围很小,但是 SSTable 内部无法快速识别这些数据是否删除,仍然要扫描大量包含删除标记的数据,导致一个小查询的响应时间可能远远超过用户预期。为了解决这类表的查询性能问题,OceanBase 数据库为用户特别提供了一种支持自定义的表模式,称为 Queuing 表 (从业务角度有时候也会称为 Buffer 表 ),对其实现了特殊的转储策略。可以通过如下方式指定 queuing 表模式。
obclient> ALTER TABLE user_table table_mode = 'queuing';
对于 queuing 表具体来说,OceanBase 数据库引入一种自适应的 buffer 表转储策略,由存储层在每次转储时根据转储的统计信息来自主判断是否需要对该表采用 buffer 表转储策略,当发现一个表存在类似 buffer 表行为时,接下来会尝试对这个表做 buffer minor merge 的调度,对这个表基于 Major SSTable 和最新的增量数据以当前的读快照时间生成一个 Buf Minor SSTable,这次 Compaction 动作会消除掉增量数据里的所有 Delete 标记,后续查询基于新生成的 Buf Minor SSTable 就可以避免原有的大量无效扫描动作。

转储触发
转储有两种触发方式:自动触发与手动触发。
当一个租户的 MemTable 内存的使用量达到 memstore_limit_percentage * freeze_trigger_percentage 所限制使用的值时,就会自动触发冻结(转储的前置动作),然后系统内部再调度转储。
您也可以通过以下的运维命令手动触发转储。
说明
memstore_limit_percentage用于设置租户使用 MemStore 的内存占其总可用内存的百分比。有关该配置项的详细介绍,参见memstore_limit_percentage。
ALTER SYSTEM MINOR FREEZE [zone] | [server_list] | [tenant_list] | [replica]
tenant_list:
TENANT [=] (tenant_name_list)
tenant_name_list:
tenant_name [, tenant_name ...]
replica:
PARTITION_ID [=] 'partition_idx%partition_count@table_id'
server_list:
SERVER [=] ip_port_list
示例:
- 集群级别转储
obclient> ALTER SYSTEM MINOR FREEZE;
- Server 级别转储
obclient> ALTER SYSTEM MINOR FREEZE SERVER='10.10.10.1:2882';
- 租户级别转储
obclient> ALTER SYSTEM MINOR FREEZE TENANT=('prod_tenant');
- Replica 级别转储
obclient> ALTER SYSTEM MINOR FREEZE PARTITION_ID = '8%1@1099511627933';
需要注意的是,尽管允许只针对单个分区手动触发 Minor Freeze,但由于多个不同的分区可能共用相同的内存块,因此对单个分区的 Minor Freeze 可能并不能有效地释放内存,而针对租户的 Minor Freeze 可以有效地释放对应租户 MEMTable 的内存。