【问题标题】:Oracle reclaim disk space after drop user cascade删除用户级联后 Oracle 回收磁盘空间
【发布时间】:2017-07-06 22:54:36
【问题描述】:

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

 drop user myDB cascade;

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

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

提前致谢。

【问题讨论】:

标签: oracle tablespace


【解决方案1】:

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

步骤顺序:

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

    通过“alter index ...重新构建表空间”命令传输索引段

  4. 丢弃旧桌面 TBS_A
  5. 将新表空间 TBS_B 重命名为 TBS_A

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2022-01-09
      相关资源
      最近更新 更多