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

问题描述 投票:0回答:1

我有这个问题:

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个这样的表。有没有办法可以完全移动它,以便我可以从表空间中回收所有可用空间?

oracle
1个回答
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';
© www.soinside.com 2019 - 2024. All rights reserved.