Oracle在用户级联后回收磁盘空间
问题描述:
我正在使用Oracle Database 12c。我有一个很大的模式,占用了20GB以上的磁盘空间。于是,我放弃了它使用命令:Oracle在用户级联后回收磁盘空间
drop user myDB cascade;
然而,表空间文件继续从磁盘取空间。在从EM Express获取的图像中,我们可以看到它在我仍然需要的数据之间有很大的可用空间。
我的问题是:我如何重新安排我的表是在短短的一个文件,然后它调整,让我可以在磁盘一些更多的空间?
在此先感谢。
答
这可以通过首先与创建数据文件1一个新的表空间,然后将所有片段从旧的表到新的表空间,所有的数据被移动,你可以删除旧表,并重新命名新老后进行。通过这种方式,新的表空间非常紧凑,可释放未使用的磁盘空间,以便操作系统可用。
的步骤序列:
- 创建新的表TBS_B用1个数据文件
- 找出需要从TBS_A传送的所有段TBS_B使用“DBA_SEGMENTS”视图
-
转移表段通过“alter table ... move tablespace”命令
通过“alter index ... rebuild tablespace”命令传输索引段
- 删除旧tablepsace TBS_A
- 重命名新的表空间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;
阅读[本文添霍尔的Oracle的基址] (https://oracle-base.com/articles/misc/reclaiming-unused-space) – APC