回收未使用的oracle lob空间“非lob数据”

时间:2014-05-13 20:03:09

标签: oracle11g

...好友

DB:Oracle 11gR2

操作系统:Linux

我有这个吊扇段(基本文件,非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段空间下存储undo数据,因此很难找到任何可用的可用空间或只是还原段。

问题:

  1. 使用move tablespace命令缩小表后,如何确切地找到可以回收的可用空间量?

  2. 我可以假设“非LOB DATA”作为当前可用空间,并且一旦段将被缩小,它将被恢复吗?

  3. 关于#2,如果开发人员清除了一些表格会执行该操作会发生什么情况,它将从数据库中请求更多撤消,这将最终变为免费,并且这种回收空间的练习将不值得。

    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列中回收所有可用空间。

2 个答案:

答案 0 :(得分:0)

在更改表之前,请检查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

答案 1 :(得分:0)

对于将来的反思。在这种情况下可以做的另一件事是我们可以缩小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>;

然后使用上面查询中的tablename,我们可以使用

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

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