写点什么

YashanDB 知识库|如何回收表空间?高水位线是关键!

作者:数据库砖家
  • 2025-04-25
    广东
  • 本文字数:854 字

    阅读完需:约 3 分钟

在使用 YashanDB 的过程中,随着数据的不断写入与删除,表空间可能会存在“看起来用掉很多,其实有大块空间可以回收”的情况。这时候我们就可以通过回收表空间的方式,释放磁盘资源,提高使用效率。

下面是回收表空间的完整操作流程,一步步来。

第一步:确认是否真的有空间可以回收

首先,我们需要查看当前表空间的高水位线情况。执行以下 SQL:

select a.tablespace_name, a.high_water_mark, b.user_bytes, b.total_bytes from (    select tablespace_name, max(header_block + blocks) * 8192 as high_water_mark     from dba_segments     where tablespace_name = 'USERS'     group by tablespace_name) a, dba_tablespaces b where a.tablespace_name = b.tablespace_name;
复制代码

这个查询会告诉你两个核心信息:

当前表空间的高水位线位置;

实际占用的 user bytes 和总空间。

如果 total_bytes 的值明显大于 high_water_mark,就说明存在可回收的空间,差值部分就是潜在的回收量,单位是 byte。

第二步:确认回收前的磁盘文件大小

在执行回收操作前,你也可以用系统命令看一下当前数据库文件实际占用的大小,例如:

ls -l $YASDB_DATA/dbfiles
复制代码

这样可以直观看到回收前后有没有效果。

第三步:执行空间回收操作

执行如下 SQL 进行表空间收缩:

ALTER TABLESPACE USERS SHRINK SPACE KEEP 200M;
复制代码

这里的 200M 参数表示“保留至少 200M 空间”,这个值必须大于高水位线所占用的空间,否则回收操作会失败。

第四步:确认回收是否成功

再次执行前面的 SQL 查询,检查 high_water_mark 是否下降,user_bytes 是否减小,或者直接用 ls 命令观察物理文件大小变化:

select a.tablespace_name, a.high_water_mark, b.user_bytes, b.total_bytes ...ls -l $YASDB_DATA/dbfiles
复制代码

如果数值有所减少,就说明回收成功了。

小结

整个过程其实就四步:

1.先确认是否有回收空间;

2.然后确认磁盘文件现状;

3.再执行 SHRINK SPACE 进行回收;

4.最后验证结果。

只要你的 KEEP 值设得合理,回收效果就会非常明显。定期清理、合理规划表空间,有助于让数据库始终保持高效运行。

用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB 知识库|如何回收表空间?高水位线是关键!_数据库·_数据库砖家_InfoQ写作社区