【求助】OceanBase 4.x 合并(Major Compaction)一直不触发,磁盘空间不释放,怎么排查?

环境:OceanBase 4.2,3 节点集群,MySQL 兼容模式,数据量约 4 亿行,单租户。

现象:

  1. 最近做了一次大批量 DELETE(清了约 8000 万行历史数据),执行完了,但磁盘使用率几乎没降(从 78% → 76%,降了一点点);
  2. 等了 3 天,__all_virtual_partition_info 里看到大部分分区还是 major_version 没变;
  3. 手动执行了 ALTER SYSTEM MAJOR FREEZE;,等了几个小时,只有少量分区完成了合并,大部分还是老版本;
  4. SHOW PARAMETERS LIKE 'major_freeze_duty_time'; 显示是默认的 `02:00’,凌晨也没见自动触发。

怀疑的点:

  • 租户内存是不是给太小了,合并跑不动?(当前 memstore_limit_percentage=50,租户内存 16G)
  • 有没有参数控制"DELETE 多少比例才触发合并"?
  • 是不是有什么锁或者长事务卡住了合并调度?

OceanBase 是 LSM-Tree,DELETE 是写一个删除标记,不是物理删除 。被删的行只有在 Major Compaction 把它合进新的 Major SSTable,且旧 SSTable 不再被引用之后 才会被空间回收
1、应该不是主因
2、没有
3、 一个 8000 万行的 DELETE 如果是单一大事务,或 DELETE 之后有长查询/备份持有快照,就会卡在 memtable 冻结/释放这一步,Major 自然调度不下去。

可以查看一下信息

SELECT TENANT_ID, STATUS, IS_ERROR, IS_SUSPENDED, INFO,
       FROZEN_SCN, GLOBAL_BROADCAST_SCN, LAST_SCN,
       LAST_FINISH_TIME, START_TIME
FROM CDB_OB_MAJOR_COMPACTION
WHERE STATUS != 'IDLE';
SELECT tenant_id, ls_id, tablet_id, type, status,
       create_time, diagnose_info
FROM __all_virtual_compaction_diagnose_info
WHERE tenant_id = {tenant_id}
ORDER BY create_time DESC LIMIT 20;
-- 4.x 查未提交长事务
SELECT trans_id, session_id, state, participants, ctx_create_time,
       expired_time
FROM oceanbase.GV$OB_TRANSACTION_PARTICIPANTS
WHERE tenant_id = {tenant_id} AND state != 'INIT';

-- 有无冻结未转储完成的 memtable(freeze_or_mini Step1/2)
SELECT * FROM __all_virtual_table_mgr
WHERE tenant_id = {tenant_id} AND table_type = 0 AND is_active = 'NO'
LIMIT 10;