最近回收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
/
查询出以后,执行查出的语句收缩注意,回收站需要清除表这是最需要注意的!