删除用户级联

时间:2017-07-06 22:54:36

标签: oracle tablespace

我使用的是Oracle Database 12c。我有一个大的架构,占用了超过20GB的磁盘空间。所以我使用命令删除它:

 drop user myDB cascade;

但是,表空间文件继续从磁盘占用空间。在从EM Express拍摄的图像中,我们可以看到它在我仍然需要的数据之间有很多可用空间。

enter image description here

我的问题是:如何将我的表空间重新组织为一个文件然后重新调整大小以便我可以在磁盘中有更多空间?

提前致谢。

2 个答案:

答案 0 :(得分:1)

这可以通过首先创建一个包含1个数据文件的新表空间,然后将所有段从旧表空间移动到新表空间来完成,在移动所有数据后,您可以删除旧表空间并将new重命名为old。通过这种方式,新的表空间非常紧凑,您可以释放未使用的磁盘空间,以便操作系统可以使用。

步骤顺序:

  1. 使用1 datafile
  2. 创建新的表空间TBS_B
  3. 使用" dba_segments"找出需要从TBS_A转移到TBS_B的所有段。图
  4. 通过" alter table ... move tablespace"转移表段。命令

    通过" alter index ... rebuild tablespace"传输索引段。命令

  5. 删除旧桌面TBS_A
  6. 将新表空间TBS_B重命名为TBS_A

答案 1 :(得分:1)

这里需要注意的一点是,在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;