最近回收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

 以上文件,会生成缩容语句,缩容语句在客户端进行执行。

  1. 有时候由于高水位问题,无法进行缩容。要解决高水位问题需要shrink表。如果很大,建议空闲事件迁移,作者曾经花费了1年半事件进行了挪动图片表,强烈建议,图片不应该放到oracle或者其他关系数据库!!!
  2. 待迁移改造完毕后,进行tuncate该表,这样就能回收缩容表空间。
  3. shrink表空间会产生大量的日志。因此如果这个表好几百G,建议你还是要慎重。
  4. 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

/

查询出以后,执行查出的语句收缩注意,回收站需要清除表这是最需要注意的!