我遇到了硬盘空间不足的问题。因此,我删除了oracle数据库中一个大表中的所有记录。但是我的硬盘空间并没有改变。我怎么才能修复它?
发布于 2017-10-13 22:39:29
尝试使用ALTER TABLE table_name SHRINK SPACE CASCADE;
并重新构建索引。
发布于 2017-10-13 23:10:27
从表中删除所有行不会重置高水位线,也不会释放任何空间。这是因为对于DML操作,Oracle假定空间将在以后重用,而不会费心释放它。
您可能希望运行一条TRUNCATE
语句。它也比DELETE
快得多,因为它不会生成任何重做或撤消。但要注意,截断表是一条不能回滚的DDL语句。
TRUNCATE
ing表将空间释放给表空间,该空间可供其他对象使用。但它仍然不能减少操作系统空间的使用量。降低磁盘空间需要缩小数据文件。
缩小数据文件可能很棘手。数据文件只能缩小到最后一个范围。在这种情况下,必须对数据文件进行碎片整理。这可以由Oracle Enterprise Manager完成,您可以找到许多其他脚本来执行此操作。它们通常涉及移动或重建所有对象。
节省空间的最简单方法是尝试缩小每个文件。这不会释放所有可用空间,但在实践中,大多数空闲空间通常是在最后一个扩展区之后,可以回收。
运行下面的脚本,它将生成一组alter语句,以尝试将数据文件大幅收缩。大多数语句都会失败,但这没问题。将数字减半,然后重复重试。这是一种“愚蠢”的方式,但它通常可以快速释放一些空间。
with decrease_size as (select 64 gb from dual)
select 'alter database datafile '''||file_name||''' resize '||to_char(round(bytes/1024/1024/1024)-(select gb from decrease_size))||'g;'
from dba_data_files
where bytes > (select gb from decrease_size) * 1024*1024*1024
order by 1 desc;
https://stackoverflow.com/questions/46732408
复制相似问题