2010-06-14 79 views
5

我有一个LOB表空间。目前可用的12GB容量为9GB。而且,据我所知,删除记录不会收回表空间中的任何存储空间。 (这是通过监视存储的简单方法 - 针对user_extents的查询,这是关于所有我被允许作为非DBA的)我担心处理进一步的处理。如何为已删除的LOB回收存储空间

我的问题是空间不够用 - 我们在12GB的表空间中大约有9GB空间,我想知道如何在请求更多空间之前回收空间。

LOB列存储在一个单独的表空间,虽然“存储在行”允许小的。

这是Oracle 11.1,数据位于同一个表中的CLOB和BLOB列中。 LOB索引段(SYS_IL ...)很小,所有存储都位于数据段(SYS_LOB ...)中

我们尝试清除并合并,并且没有得到任何位置 - 相同的字节数在user_extents中。

“Alter table xxx move”可以工作,但我们需要有一个地方将它移动到有足够空间用于修改数据。当然,我们还需要在数小时内完成并重建索引,但这很简单。

复制出良好的数据并进行截断,然后将其复制回来也将起作用。但这几乎就是“alter table”命令所做的。

我是否错过了一些简单的方法来收缩东西并重新获得存储空间?或者是“改变表xxx移动”的最佳方法?或者这是一个非问题,当需要时,Oracle会从删除的lob行中取回空间?

+0

“这是所有我被允许作为非DBA” 我没法不注意到这一点,这是值得一说,并非每一个技术问题有技术答案。如果您是负责担心这些事情的人,则应该授予您DBA权限或至少SELECT ANY DICTIONARY系统特权。如果你不是,你应该在影响其他用户之前升级这样的东西。 – durette 2016-11-16 17:07:12

回答

1

一般来说,一旦扩展分配给一个表,它就保持分配。如果将附加数据插入表中,则可以重新使用表中的空白空间。但是,很难从表格内回收空间,因为表格可能具有(例如)块1至100,并且空块在块50-75中,或空块是1,3,5,7等

问题是,您是否担心表中的空间被重复使用,或者您是否需要为表空间中的其他对象释放空间,或者您是否需要能够缩小表空间数据文件?

6

这个问题很旧,但从来没有一个工作的答案,并可能对很多人有用,所以在这里我遇到这个问题时找到了解决方案。

你是对的,删除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%'; 
+0

如果尚未启用,则不要忘记启用行移动:ALTER TABLE x_tab ENABLE ROW MOVEMENT; – durette 2016-11-16 17:11:34