磁盘空间告警处理

今天收到监控告警,OceanBase 数据盘使用率超过 85%。请问在 OceanBase 中,如何快速定位是哪些租户、哪些表占用了最多的磁盘空间?如果要清理数据,直接 DROPTRUNCATE 表,磁盘空间会立即释放给操作系统吗?

@论坛小助手

在 OceanBase 中,可以通过以下步骤快速定位哪些租户、哪些表占用了最多的磁盘空间:

  1. 查看各租户占用的磁盘空间,可以使用系统视图 oceanbase.CDB_OB_SPACE_USAGE
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_SPACE_USAGE LIMIT 10;

此查询将列出各个租户在所有节点上的磁盘空间占用情况。

  1. 查看某个租户下所有表占用的磁盘大小,可以使用下面的 SQL 语句:
SELECT /*+ query_timeout(30000000) */ a.TENANT_ID, a.DATABASE_NAME, a.TABLE_NAME, a.TABLE_ID, sum(case when b.nested_offset = 0 then IFNULL(b.data_block_count+b.index_block_count+b.linked_block_count, 0) * 2 * 1024 * 1024 else IFNULL(b.size, 0) end) /1024.0/1024/1024 as data_size_in_GB 
FROM oceanbase.CDB_OB_TABLE_LOCATIONS a inner join oceanbase.__all_virtual_table_mgr b on a.svr_ip = b.svr_ip and a.svr_port=b.svr_port and a.tenant_id = b.tenant_id and a.LS_ID = b.LS_ID and a.TABLET_ID = b.TABLET_ID and a.role ='LEADER' and a.tenant_id = ${租户ID} 
and b.table_type >= 10 and b.size > 0 group by a.TABLE_ID;

此查询将列出特定租户下所有表的磁盘占用情况。

关于清理数据的问题:

  • 直接 DROPTRUNCATE 表,不会立即将磁盘空间释放给操作系统。这些操作会标记表的数据为已删除状态,并将其存储空间标记为空闲,以供后续的数据写入使用。
  • 若要立即释放磁盘空间,建议使用 ALTER TABLESPACE ... COALESCE 或者等待垃圾回收机制触发,这取决于您的数据库配置。

详情请参考:

  1. 查看租户或表占用的磁盘空间
  2. oceanbase.CDB_OB_SPACE_USAGE
  3. 某租户下所有表占用磁盘大小
1 个赞

学习了

厉害

@论坛小助手,没说清楚版本,在以前的版本好像没有该视图

根据提供的文档片段,information_schema.events 视图是在特定版本后才被引入:

  • 在 V4.3.x 版本中,该视图从 V4.3.2 版本开始引入。
  • 在 V4.2.x 版本中,该视图从 V4.2.1 BP5 版本和 V4.2.4 版本开始引入。
    因此,如果您提到的‘以前的版本’是指早于上述版本的话,那么确实可能没有 information_schema.events 视图。如果需要更具体的信息,建议提供具体的版本号。

详情请参考:

  1. information_schema.events

oceanbase.CDB_OB_SPACE_USAGE视图从 V4.3.4 版本开始引入。