我遇到硬盘空间不足的问题。 所以我删除了我的oracle数据库中一个大表的所有记录。 但我的硬盘空间没有改变。 我该如何解决?
答案 0 :(得分:3)
尝试ALTER TABLE table_name SHRINK SPACE CASCADE;
并重建索引。
答案 1 :(得分:1)
从表中删除所有行不会重置高水位线,也不会释放任何空间。这是因为通过DML操作,Oracle假设空间将在以后重复使用,并且不会发布它。
您可能希望改为运行TRUNCATE
语句。它也比DELETE
快得多,因为它不会产生任何REDO或UNDO。但请注意,截断表是一个无法回滚的DDL语句。
TRUNCATE
表向表空间释放空间,该空间可供其他对象使用。但它仍然没有减少使用的操作系统空间。降低磁盘空间需要缩小数据文件。
缩小数据文件可能会非常棘手。数据文件只能缩小到最后一个范围。如果单个数据块位于文件末尾,则数据文件可能有大量空白空间但不可缩小。在这种情况下,必须对数据文件进行碎片整理。这可以通过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;