我如何在 oracle 10G 中收缩数据文件?
5 回答
警告:我不是 Oracle 系统管理员,除了个人安装。用一大粒盐来接受我所说的一切。
我假设您使用自动扩展创建了数据文件,并且它们已经扩展超出了您认为它们应该包含的内容。ALTER DATABASE 有一个子句可以调整文件大小,这是 Oracle SQL 参考中的示例:
ALTER DATABASE
DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;
但是,我真的不认为您想盲目地这样做。IMO 更好的方法是使用 export 命令转储该数据文件中的表,然后重新创建表空间。
这是一种方法,由 Tom Kyte 提供,用于获取数据库的块大小,列出您可以回收多少空间,并构建 alter... 命令以实际执行数据库缩小。希望这可以帮助,
http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html
克雷格格伦登宁
@Dave关于导出和导入的回答是正确的,是释放空间的最佳选择。同样在 Oracle 中没有收缩命令,@Dave是正确的,但存在调整大小命令,正如@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
不用担心这个脚本不会从数据文件中删除任何使用过的块。
ALTER TABLESPACE....RESIZE 只允许超出 HWM。因此,您可能在它下面有许多未使用的 segmnet。在此操作之前,发出:
ALTER TABLE .. .SHRINK SPACE 在该表空间/数据文件的某些表上,以便重新组织数据文件的内容。
可能是一项漫长的任务,但您可以使用 SQL 生成命令。
对于 Oracle 中的标准数据文件,您无法缩小它们。您必须执行以下操作:
- 将段移动到另一个表空间,或导出并删除它们
- 删除数据文件
- 创建一个新的较小的数据文件
- 将段移回第一个表,或从转储文件中导入它们
对于“大文件”表空间——意味着 CREATE BIGFILE TABLESPACE 用于创建它——你可以使用 ALTER TABLESPACE .. RESIZE ...