oracle 如何删除lob,如何回收已删除LOB的存储

这个问题很古老,但从来没有一个有效的答案,可能对很多人有用,所以这里我找到了解决这个问题的方法。

您是对的,删除LOB不会回收Tablescape中的任何存储。

在删除LOB之前和之后运行此查询将得到相同的结果

select bytes

from user_segments

where tablespace_name = yourTableSpace

and segment_name = yourTableName;

阅读

this

Oracle文档,我发现您需要执行以下语句

ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE);

它会收缩

BASICFILE

LOB段。

现在,如果您重新执行查询

选择字节

来自用户段

其中tablespace_name=yourtablespace

段名称=您的表名称;

您将注意到空间已经释放到表空间,并且可以根据需要重新使用该空间。

现在,对于那些想释放磁盘空间的人,请注意,数据文件不会自动重新调整大小,并且仍将保持磁盘的完整大小。

但是,在重新调整数据文件的大小之前,请确保使用这些查询(使用所需的查询)释放段中未使用的空间(如前所述从同一个文档中窃取该空间)。

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%';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值