Oracle 收缩/回收可用表空间空间

r0t*_*0tt 8 oracle shrink tablespaces oracle-12c

我有一个大小为 90GB 的 Oracle 12c 表空间。几乎 40GB 是免费的。

TB1 54 %    90880   41383   49497   46  98304   50 %    ONLINE  PERMANENT
Run Code Online (Sandbox Code Playgroud)

表空间有 3 个数据文件。

E:\ORACLE\ORADATA\xx\TB1.DBF    33554416    True    100 
F:\ORACLE\ORADATA\xx\TB1_2.DBF  33554416    True    100 
G:\ORACLE\ORADATA\xx\TB1_3.DBF  25344000    True    100
Run Code Online (Sandbox Code Playgroud)

如何缩小表空间以回收可用的 40GB(磁盘上的数据文件)?我不能有停机时间。

Mar*_*art 8

我同意 EdStevens 的评论,但这里有一些其他想法:

AskTom网站 有一个脚本,将列出究竟有多少可以收缩现有的数据文件。

如果这不会产生多少节省,您可以在该表空间上找到最大的索引并重建它们;这是一个临时解决方案,索引最终会再次变大,但如果现在预算不允许更多磁盘空间,请尝试以下查询:

select segment_name, sum(bytes)/1024/1024 as mb 
from dba_segments 
where tablespace_name='TB1' and segment_type like 'INDEX%'
group by segment_name
order by mb;
Run Code Online (Sandbox Code Playgroud)

那么如果你发现一个名为的索引 ind_big_stuff很大,那么

alter index ind_big_stuff rebuild online;
Run Code Online (Sandbox Code Playgroud)

此外,如果您的应用程序是商业应用程序,则可能有多个表为零行。或者如果你有分区表,你可能有一些零行的分区。您可以删除分配给他们的空间

exec dbms_space_admin.drop_empty_segments(schema_name=>'HR');
Run Code Online (Sandbox Code Playgroud)

您可以segment creation deferred对诸如分区表或您知道没有任何行的表之类的内容使用 alter table 语句上的子句。


r0t*_*0tt 5

我认为有五种方法可以处理这个oracle维护问题:

\n\n
    \n
  • 在线重组 - Oracle 在线表重组包 (dbms_redefinition) 用于在表接受更新时对其进行重组。它保留索引和约束定义。(仅限企业版)。没有停机时间。
  • \n
  • 更改表收缩空间 - 使用 alter table Shrink space Compact 命令将重新打包行、向下移动 HWM 并释放未使用的盘区。收缩仅压缩数据。它不保证块将被放置在数据文件的前面,因此可能在数据文件的末尾有块,这意味着数据文件的大小无法调整得更小。它保留索引和约束定义。没有停机时间。
  • \n
  • 数据泵(expdp、impdp)\xe2\x80\x93 传输数据和\n重新组织表的离线方法。它保留索引和约束定义。需要停机。
  • \n
  • 更改表移动 - 更改表移动命令将行向下移动到\n未使用的空间并调整 HWM,但不调整段\n范围,并且表大小保持不变。alter table move\ns语法还保留索引和约束定义。需要调整数据文件\n大小。需要停机。
  • \n
  • 创建表作为选择 (CTAS) - 这会将表行复制到\n干净的区域,降低高水位线,密集地打包行\n(根据 PCTFREE 的规定)并释放可用空间。需要调整数据文件大小。\n 需要停机。
  • \n
\n

  • 并且 CTAS 将暂时需要额外的空间,直到命令完成之后,您才能删除旧表并重命名新表。另外,这不会隐藏所有的约束、索引等。 (2认同)