从表空间恢复逻辑空间

Nun*_*ado 11 oracle tablespaces

我有一个名为 DATA 的表空间,它设置为自动扩展为 false。这个表空间有两个数据文件,并且设置为占用 350 GB 的物理空间。

一周前,我查询了 user_tablespaces 和 dba_data_files,发现它有 20% 的可用逻辑空间。然后我继续清理并从该表空间的表中删除了许多记录。我们期望看到可用空间的大幅增加。不幸的是,当我查询视图时,我注意到可用空间现在是 20.5%。

这可能是由于数据碎片造成的吗?我们可以以某种方式对表空间进行“碎片整理”并恢复丢失的空间吗?还是我们需要从头开始重新创建表空间?

Lei*_*fel 14

当您删除记录时,不会自动压缩段,因此您需要进行段收缩以回收空间。以下是 11.2 管理员指南关于回收浪费空间的摘录:

随着时间的推移,表空间内对象的更新和删除会创建一些空白空间,这些空间单独不够大,无法重新用于新数据。这种类型的空闲空间称为碎片空闲空间。

具有碎片化可用空间的对象会导致大量空间浪费,并可能影响数据库性能。对该空间进行碎片整理和回收的首选方法是执行在线段收缩。此过程合并高水位线以下的碎片自由空间并压缩该段。压缩后,高水位线被移动,从而在高水位线上方产生新的自由空间。然后解除分配高水位线以上的空间。在大部分操作期间,该段保持可用于查询和 DML,并且不需要分配额外的磁盘空间。

在同一页面的进一步下方,您可以阅读以下内容:

段收缩是一种在线的就地操作。DML 操作和查询可以在段收缩的数据移动阶段发出。当空间被释放时,在收缩操作结束时并发 DML 操作会被阻塞一小段时间。索引在收缩操作期间保持不变,并在操作完成后保持可用。段收缩不需要分配额外的磁盘空间。

段收缩回收高水位线上方和下方的未使用空间。相比之下,空间释放仅回收高水位线以上的未使用空间。在收缩操作中,默认情况下,数据库会压缩段,调整高水位线,并释放回收的空间。

该页面包含有关该问题的更多信息,包括示例。

概念指南中的“段空间和高水位线”部分也可能有用。


Phi*_*lᵀᴹ 9

是的,这将是由于碎片化。

要回收空间,首先使用以下查询获取表空间中的表列表(忽略分区 - 如果您正在使用它们,请编辑您的问题):

select distinct table_name from dba_tables where tablespace_name = 'DATA';
Run Code Online (Sandbox Code Playgroud)

然后对于每个表,启用行移动:

alter table TABLEINDATAPARTITION enable row movement;
Run Code Online (Sandbox Code Playgroud)

然后你可以缩小表格:

alter table TABLEINDATAPARTITION shrink space;
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令缩小数据文件:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;
Run Code Online (Sandbox Code Playgroud)

可以从DBA_DATA_FILES您已经知道的视图中获取数据文件名称。