今天收到监控告警,OceanBase 数据盘使用率超过 85%。请问在 OceanBase 中,如何快速定位是哪些租户、哪些表占用了最多的磁盘空间?如果要清理数据,直接 DROP 或 TRUNCATE 表,磁盘空间会立即释放给操作系统吗?
在 OceanBase 中,可以通过以下步骤快速定位哪些租户、哪些表占用了最多的磁盘空间:
- 查看各租户占用的磁盘空间,可以使用系统视图
oceanbase.CDB_OB_SPACE_USAGE:
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_SPACE_USAGE LIMIT 10;
此查询将列出各个租户在所有节点上的磁盘空间占用情况。
- 查看某个租户下所有表占用的磁盘大小,可以使用下面的 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;
此查询将列出特定租户下所有表的磁盘占用情况。
关于清理数据的问题:
- 直接
DROP或TRUNCATE表,不会立即将磁盘空间释放给操作系统。这些操作会标记表的数据为已删除状态,并将其存储空间标记为空闲,以供后续的数据写入使用。 - 若要立即释放磁盘空间,建议使用
ALTER TABLESPACE ... COALESCE或者等待垃圾回收机制触发,这取决于您的数据库配置。
详情请参考:
- 查看租户或表占用的磁盘空间
- oceanbase.CDB_OB_SPACE_USAGE
- 某租户下所有表占用磁盘大小
1 个赞
学习了
厉害
根据提供的文档片段,information_schema.events 视图是在特定版本后才被引入:
- 在 V4.3.x 版本中,该视图从 V4.3.2 版本开始引入。
- 在 V4.2.x 版本中,该视图从 V4.2.1 BP5 版本和 V4.2.4 版本开始引入。
因此,如果您提到的‘以前的版本’是指早于上述版本的话,那么确实可能没有information_schema.events视图。如果需要更具体的信息,建议提供具体的版本号。
详情请参考:
oceanbase.CDB_OB_SPACE_USAGE视图从 V4.3.4 版本开始引入。