Oracle - 移动所有表并回收可用空间

时间:2016-08-02 10:30:26

标签: oracle

我有这个问题:

select file_id, block_id first_block, block_id+blocks-1 last_block,
segment_name
from dba_extents
where tablespace_name = 'USERS'
union all
select file_id, block_id, block_id+blocks-1, 'free'
from dba_free_space
where tablespace_name = 'USERS'
order by file_id, first_block DESC;

它显示了许多"免费"介于两者之间。有很多桌子介于两者之间。

我使用以下方式移动表格:

Alter table table_name move;

我有2000张这样的表。有没有办法可以完全移动它,以便我可以从表空间中回收所有可用空间?

1 个答案:

答案 0 :(得分:1)

要实现目标,您必须移动表空间中的所有对象,而不仅仅是表。 至少您必须移动表然后重建所有索引,因为当您移动表时,在此表上构建的所有索引都将失效。 您不能将所有表一起移动,但可以通过以下方式获取所有命令:

 select 'alter table ' ||table_name ||' move;'
 from dba_tables where tablespace_name = 'YOURTABLESPACENAME';

重建索引:

select 'alter index ' ||index_name ||' rebuild;'
 from dba_indexes where tablespace_name = 'YOURTABLESPACENAME' and status <>'VALID';

小心:此程序不完整,您可以拥有不同类型的索引。

注意:要获得最佳效果,您应该在不同的表空间中移动对象。

更简单的方法可以是解释here的方法:本文描述了如何对Oracle数据库表使用shrink命令来回收有缺陷的空间。

如果您需要详细的程序,请告诉我以下查询的结果:

select distinct segment_type from  dba_segments where tablespace_name='YOURTABLESPACENAME';