回收未使用的预言机空间"non lob data"



朋友。。。

数据库:Oracle 11gR2

操作系统:Linux

我有一个lob段(基本文件,非assm(,它占用了100 GB的存储空间,我查询了"dba_extents"、dbms_lob.getlength(lob_col(并找到了

Total storage occupied: 100 GB
Lob Data: 70 GB
non Lob Data (storage - lob data): 30 GB

根据oracle metalink 386341.1,它表示非lob数据既可以是空闲空间,也可以是撤消空间,因为lob段将撤消数据存储在lob段空间下,因此很难找到任何可用的空闲空间,或者只是撤消段。

问题:

  1. 当我们使用movetablespace命令收缩表时,如何准确地找到可以回收的可用空间?

  2. 我可以假设"非LOB数据"是当前的可用空间吗?一旦数据段被收缩,它就会被恢复吗?

关于#2,如果开发人员清除一些表lob并执行该操作,将从数据库中请求更多撤消操作,而数据库最终将变得免费,那么这种回收空间的做法将不值得。

output of dbms_space.unused_space
=================================
total block : 11900000
total bytes : 102208345855
unused blocks: 0
unused bytes : 0
last used extent file id : 345
last used extent block id: 856800
last used block: 8192

基本上,我的目标是从lob列中回收所有可用空间。

在更改表之前,请从dba_segments检查表的大小,并在执行以下语法后检查大小,以了解回收了多少空间。

用于回收LOB空间的语法为:

SQL> ALTER TABLE <table_name> MODIFY LOB (<lob_column>) (SHRINK SPACE);

这也将帮助您回收空间。

ALTER TABLE test MOVE LOB(image) STORE AS ( TABLESPACE lob_dat1 ) 
/

http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_85.shtml

对于未来的参考。在这种情况下可以做的另一件事是,我们可以缩小LOB的相应表。

首先,我们可以通过运行以下查询来找到特定LOB的对应表

  select  a.table_name,  a.segment_name , b.bytes/1024/1024 from dba_lobs a, dba_segments b where a.segment_name = b.segment_name and a.owner = b.owner and b.segment_name=<LOB_NAME>;

然后使用上面查询的表名,我们可以使用缩小表

Alter table <TABLE_NAME> enable row movement;
Alter table <TABLE_NAME> shrink space cascade;
Alter table <TABLE_NAME> disable row movement;

这将收缩表和表的相应LOB,以回收未使用的空间。

相关内容

最新更新