Oracle在用户级联后回收磁盘空间

问题描述:

我正在使用Oracle Database 12c。我有一个很大的模式,占用了20GB以上的磁盘空间。于是,我放弃了它使用命令:Oracle在用户级联后回收磁盘空间

drop user myDB cascade; 

然而,表空间文件继续从磁盘取空间。在从EM Express获取的图像中,我们可以看到它在我仍然需要的数据之间有很大的可用空间。

enter image description here

我的问题是:我如何重新安排我的表是在短短的一个文件,然后它调整,让我可以在磁盘一些更多的空间?

在此先感谢。

+0

阅读[本文添霍尔的Oracle的基址] (https://oracle-base.com/articles/misc/reclaiming-unused-space) – APC

这可以通过首先与创建数据文件1一个新的表空间,然后将所有片段从旧的表到新的表空间,所有的数据被移动,你可以删除旧表,并重新命名新老后进行。通过这种方式,新的表空间非常紧凑,可释放未使用的磁盘空间,以便操作系统可用。

的步骤序列:

  1. 创建新的表TBS_B用1个数据文件
  2. 找出需要从TBS_A传送的所有段TBS_B使用“DBA_SEGMENTS”视图
  3. 转移表段通过“alter table ... move tablespace”命令

    通过“alter index ... rebuild tablespace”命令传输索引段

  4. 删除旧tablepsace TBS_A
  5. 重命名新的表空间TBS_B到TBS_A

一到这里要注意的是,在oracle中删除一个用户不会从它的表空间释放空间。表空间占用自己的空间,它充当数据库用户的虚拟存储空间。因此,删除用户将在该表空间中创建可用空间,然后可以由该表空间的另一个用户使用该空间。

要检查可用空间中所有表空间使用此查询:

select tot.tablespace_name, tot.file_name, tot.bytes/1024/1024 size_mb, free.free_mb 
from dba_data_files tot, (select file_id, sum(bytes/1024/1024) free_mb FROM dba_free_space free group by file_id) free 
where tot.file_id=free.file_id 
order by free.free_mb; 

对于重组的表空间,你将不得不重组其内容即表和索引。重组需要在表空间中使空间翻倍,因为它会将表和索引移动到新块中,但在重新组织之后,可以通过调整表空间数据文件的大小来回收空间。

要移动表和索引,首先确定哪些对象是使用使用DBA_SEGMENTS视图您的表空间,然后移动/使用这些命令重建这些对象:

alter table TABLENAME move; 
alter index INDEXNAME rebuild online;