oracle 10G收缩数据文件

时间:2008-12-24 11:35:30

标签: oracle oracle10g

如何在oracle 10G中收缩数据文件?

5 个答案:

答案 0 :(得分:1)

警告:除个人安装外,我不是Oracle系统管理员。把我所说的一切都拿出一大块盐。

我假设您使用自动扩展创建了数据文件,并且它们已经超出了您认为应该包含的内容。 ALTER DATABASE有一个子句可以调整文件大小,这里是Oracle SQL参考的例子:

ALTER DATABASE
DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;

但是,我真的不认为你想盲目地这样做。更好的方法IMO将使用export命令转储该数据文件中的表,然后重新创建表空间。

答案 1 :(得分:1)

这是一种方式,由Tom Kyte提供获取数据库块大小的方法,列出可以回收的空间大小,并构建alter ...命令以实际执行数据库收缩。希望这会有所帮助,

http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html

Craig Glendenning

答案 2 :(得分:0)

ALTER TABLESPACE ....仅允许在HWM之外调整大小。所以你可能在它下面有许多未使用的segmnet。在此操作之前,请发出:

ALTER TABLE .. .SHRINK SPACE在该表空间/数据文件的某些表上,以便重新组织数据文件的内容。

可能是一项长期任务,但您可以使用SQL生成命令。

答案 3 :(得分:0)

@Dave 关于导出和导入的答案是正确的,是释放空间的最佳选择。 同样在Oracle中没有收缩命令, @Dave 是正确的但存在resize命令,因为 @David 表示“数据文件可以调整到最后使用的块”但有一个值得一提的是,数据文件中的空闲块可能会像那样分配

0101000001111000000000000000000001110000000000
                                    |---------

其中: 0-是空闲块 1 - 使用块

通过调整数据文件的大小直到最后一个使用的块,它将变为:

010100000111100000000000000000000111
                                    |---------     

但是数据文件中的其他空闲块呢?它们不适用于其他数据文件或系统本身。

如果数据文件是这样的:

1111111111111100000000000000000

然后调整大小将是有用的,但不是以前的变体。

无论如何要确定你能调整大小数据文件的大小,这里是脚本:

    select 'alter database '||a.name||' datafile '''||b.file_name||'''' ||
' resize '||greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free))||chr(10)||
'--tablespace was '||trunc(bytes_full*100/bytes_total)||
'% full now '||
trunc(bytes_full*100/greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free)))||'%'
from v$database a
,dba_data_files b
,(Select tablespace_name,sum(bytes) bytes_full
From dba_extents
Group by tablespace_name) c
,(Select tablespace_name,sum(bytes) bytes_total
From dba_data_files
Group by tablespace_name) d
,(Select a.tablespace_name,a.file_id,b.bytes bytes_free
From (select tablespace_name,file_id
,max(block_id) max_data_block_id 
from dba_extents
group by tablespace_name,file_id) a
,dba_free_space b
where a.tablespace_name = b.tablespace_name
and a.file_id = b.file_id
and b.block_id > a.max_data_block_id) e
Where b.tablespace_name = c.tablespace_name
And b.tablespace_name = d.tablespace_name
And bytes_full/bytes_total < .7
And b.tablespace_name = e.tablespace_name
And b.file_id = e.file_id

不要担心此脚本不会从数据文件中删除任何已使用的块。

答案 4 :(得分:-1)

对于Oracle中的标准数据文件,您无法收缩它们。你必须做类似的事情:

  1. 将细分移动到另一个表空间,或者导出和删除它们
  2. 删除数据文件
  3. 创建新的较小数据文件
  4. 将段移回第一个表,或从转储文件中导入
  5. 对于“bigfile”表空间 - 意味着使用CREATE BIGFILE TABLESPACE创建它 - 您可以使用ALTER TABLESPACE .. RESIZE ...