这个问题很旧,但从来没有一个工作的答案,并可能对很多人有用,所以在这里我遇到这个问题时找到了解决方案。
你是对的,删除LOB将不会回收任何存储在tablescape中。
运行此查询之前和删除LOB后会产生相同的结果
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
阅读this甲骨文的文档,我发现你需要执行下面的语句
ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE);
这将缩小一个BASICFILE
LOB段。
现在,如果你重新执行查询
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
你会发现空间已被释放到表空间,并能够为你想重新使用空间。
现在对于那些想释放磁盘空间的人来说,请注意数据文件不会自动重新调整大小,并且仍然会保持磁盘上的完整大小。
但在此之前调整大小的数据文件,使用这些查询,确保你在一个段解除分配未使用的空间(从同一个文档偷走了如前所述)(使用一个你需要的)
ALTER TABLE table DEALLOCATE UNUSED KEEP integer;
ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;
注KEEP
子句是可选的,并允许您指定段中保留的空间量。您可以通过检查DBA_FREE_SPACE
视图来验证释放的空间是否已释放。
现在重新大小的数据文件,
ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M
注意,最大尺寸调整是基于数据的数据文件的最后一个块的位置时,你可以缩小。因此,删除大量数据后,您很难有机会重新调整大小。然后,最简单的方法是导出数据并在另一个表空间中重新导入,然后删除旧的表空间。在导入数据时,Oracle会尽可能地打包它们。
如果你想释放更多的空间,你可以清空临时表空间,这有时候会占用很大的空间(我的数据库为5GB)。使用下面的语句来检查它的大小:
SELECT tablespace_name, file_name, bytes
FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
“这是所有我被允许作为非DBA” 我没法不注意到这一点,这是值得一说,并非每一个技术问题有技术答案。如果您是负责担心这些事情的人,则应该授予您DBA权限或至少SELECT ANY DICTIONARY系统特权。如果你不是,你应该在影响其他用户之前升级这样的东西。 – durette 2016-11-16 17:07:12