在 OceanBase 数据库系统中,转储(compaction)是当 MemTable 的大小超过一定阈值时,就需要将 MemTable 中的数据转存到 SSTable 中以释放内存的过程。有时候,转储失败可能导致内存无法按预期释放,从而影响系统性能。
本文档提供了一种方法来排查和诊断转储失败和内存无法释放的问题。
诊断冻结与转储失败
在数据库操作中,首先需要确定问题是冻结(freeze)操作失败还是转储(dump/flush)操作失败。
- 冻结失败
如果 MemTable 没有发生冻结,可能是事务日志处理中出现了问题。在这种情况下,需要联系负责技术支持人员进行问题诊断。
- 转储失败
如果 MemTable 已经冻结,但是内存没有得到释放,可能是转储操作没有成功完成。这可能是因为内存中的数据没有正确写入磁盘。
排查已冻结的 MemTable 是否已转储
如果 MemTable 已经冻结,下一步是确认这个 MemTable 是否已经成功转储。以下是用于排查的 SQL 查询:
OceanBase 数据库 V4.x 之前版本
select * from __all_virtual_table_mgr where svr_ip = "xxx" and svr_port = xxx and table_id = xxx and table_type=0 and is_active = 0 and snapshot_version > (select max(snapshot_version) from __all_virtual_table_mgr where svr_ip = "xxx" and svr_port = xxx and table_id = xxx and (table_type = 7 or table_type = 4)));OceanBase 数据库 V4.x 版本
select* from __all_virtual_table_mgr where svr_ip = "xxx" and svr_port = xxx and tenant_id=xx and tablet_id = xx and table_type = 0 and is_active='NO' and end_log_scn > (select MAX(end_log_scn) from __all_virtual_table_mgr where svr_ip = "xxx" and svr_port = xxx and tenant_id=xx and tablet_id = xx and (table_type = 11 or table_type = 12));
如果查询结果返回了行条目,则表示存在已冻结的 MemTable ,这意味着有 MemTable 已经转储了但未得到正确释放。
如果 MemTable 未转储
如果已确认 MemTable 未转储,需要进一步排查原因。可以通过查找日志中转储失败的迹象来进行排查:
grep "dag_ret:-" observer.log.xxxx* | vi -
在上述命令的结果中,搜索是否有无法转储 partition 的 table_id。
适用版本
OceanBase 数据库所有版本。