从表空间恢复逻辑空间


11

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

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

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

Answers:


14

删除记录时,没有任何内容会自动压缩段,因此您需要缩小段以回收空间。以下摘录自《 11.2 回收浪费空间管理员指南》:

随着时间的流逝,对表空间内对象的更新和删除会创建空白空间,这些空白空间各自的大小不足以重新用于新数据。这种类型的空白空间称为零碎的可用空间。

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

在同一页面上,您可以阅读以下内容:

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

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

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

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


9

是的,这是由于碎片。

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

select distinct table_name from dba_tables where tablespace_name = 'DATA';

然后为每个表启用行移动:

alter table TABLEINDATAPARTITION enable row movement;

然后可以缩小表:

alter table TABLEINDATAPARTITION shrink space;

然后使用以下方法收缩数据文件:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

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


优秀,实用的答案。+1
雷·里菲尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.