YashanDB 知识库|手把手教你回收表空间,释放磁盘的正确姿势!

在数据库运行过程中,随着数据的不断写入和删除,表空间会逐渐出现"空洞",也就是虽然数据删除了,但磁盘空间并没有真正释放。为了提升磁盘利用率,YashanDB 提供了表空间收缩功能。下面就一步步教你,如何高效回收表空间。

一、确认有没有可回收空间

首先,需要查询表空间的高水位线信息,判断是否存在可以回收的空间。

执行以下 SQL:

csharp 复制代码
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;

查询结果中,如果 total_bytes 的数值明显大于 high_water_mark,说明这段差值就是可以回收的空间,单位是 byte。

二、查看回收前磁盘占用

可以通过系统命令查看当前表空间对应的数据文件大小,例如:

bash 复制代码
ls -l $YASDB_DATA/dbfiles

这样可以在回收前有一个参考值,方便后续对比变化。

三、执行空间回收操作

确定有可回收空间后,使用下面的命令收缩表空间:

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

注意,这里的 200M 是保留的最小空间,必须要大于当前高水位线占用的空间大小,否则回收操作会失败。

四、确认回收效果

回收完成后,再次执行高水位线查询命令,以及查看磁盘文件大小:

csharp 复制代码
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;
ls -l $YASDB_DATA/dbfiles

如果 total_bytes 减少了,或者磁盘文件大小明显缩小了,就说明空间回收成功。

五、总结小贴士

回收前务必确认表空间的高水位线;

KEEP 参数一定要合理设置,防止因空间不足回收失败;

表空间收缩操作一般建议在业务低峰期执行,避免影响在线业务;

定期回收可以有效避免磁盘空间浪费,提升整体系统性能。

相关推荐
fen_fen1 小时前
用户信息表建表及批量插入 100 条数据(MySQL/Oracle)
数据库·mysql·oracle
马克Markorg8 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道12 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075312 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha12 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance12 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋12 小时前
【Redis】主从复制
数据库·redis