Oracle回收磁盘空间
Posted 李石岩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle回收磁盘空间相关的知识,希望对你有一定的参考价值。
最近回收asm磁盘,需要对数据文件进行缩容,进行整理
set verify off
column file_name format a50 word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report
column value new_val blksize
select value from v$parameter where name = db_block_size
/
select file_name,
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
ceil( blocks*&&blksize/1024/1024) currsize,
ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
/
column cmd format a75 word_wrapped
select alter database datafile ||file_name|| resize || ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) || m; cmd
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
and ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
以上文件,会生成缩容语句,缩容语句在客户端进行执行。
- 有时候由于高水位问题,无法进行缩容。要解决高水位问题需要shrink表。如果很大,建议空闲事件迁移,作者曾经花费了1年半事件进行了挪动图片表,强烈建议,图片不应该放到oracle或者其他关系数据库!!!
- 待迁移改造完毕后,进行tuncate该表,这样就能回收缩容表空间。
- shrink表空间会产生大量的日志。因此如果这个表好几百G,建议你还是要慎重。
- delete这个要分批进行清理。
有可能遇到这样的问题
但是遇到了ORA-ORA-03297 这种方法失效。需要extents来做查出占用最大区段的表然后移动
收缩问题解决方法
1.查询表FILE_ID
SELECT * FROM dba_data_files ;
2.查询最大区段占用的表,查出需要移动的表,然后create table 。。 as select * from 表,然后再查询占用。
前提因为删除大量空间,导致该原因,create 。。as以后可能会不在最大区段,如果实在没空间,需要expdp放到别的表空间。
select * from dba_extents where block_id=(select max(block_id) from dba_extents where file_id=5);
3.执行以下语句
set verify off
column file_name format a50 word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report
column value new_val blksize
select value from v$parameter where name = db_block_size
/
select file_name,
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
ceil( blocks*&&blksize/1024/1024) currsize,
ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
/
column cmd format a75 word_wrapped
select alter database datafile ||file_name|| resize ||
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) || m; cmd
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
and ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/
查询出以后,执行查出的语句收缩注意,回收站需要清除表这是最需要注意的!
以上是关于Oracle回收磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章