场景说明:
客户 ASM磁盘组,data磁盘组空闲空间90G,空间不足,因此强烈建议回收空间
空间回收方案:
1.数据文件resize,回收部分可用性空间(好处就是能够将ASM磁盘组free大小增加);
2.大的无用对象清理,释放空闲空间(好处就是释放空间所在的表空间,新增数据能够使用删除的大对象原空间,而无需对表空间进行扩容);
1.回收数据文件,对数据文件进行resize
SQL>select a.file#,a.name,c.tablespace_name,round(a.bytes/1024/1024) CurrentMB,ceil(HWM*a.block_size)/1024/1024 ResizeTo, (a.bytes-HWM*a.block_size)/1024/1024 ReleaseMB,'alter database datafile '||a.FILE#||' resize '||round(ceil(HWM*a.block_size)/1024/1024+5)||' M;' ResizeCmd from v$datafile a,(SELECT file_id,MAX(block_id+blocks-1) HWM FROM DBA_EXTENTS GROUP BY file_id) b,dba_data_files c where a.file#=b.file_id(+) And (a.bytes-HWM*a.block_size)>0 and a.FILE#=c.file_id and c.tablespace_name not in('SYSTEM','SYSAUX') and c.tablespace_name not like'%UNDO%' order by 6 desc;
SQL> select group_number,name,total_mb/1024 TOTAL_GB,free_mb/1024 FREE_GB,free_mb/total_mb*100 free_percent,state,TYPE,(case when free_mb/total_mb*100 < 15 then '*' else '' end ) care from v$ASM_DISKGROUP;
SQL思路,查询每个数据文件中max_block_id *表空间的block_size,进行计算+5m(保守),是数据文件最大的大小,进行resize回收,排除undo,system,sysaux,temp表空间
2.大的无用对象清理,释放空闲空间(好处就是释放空间所在的表空间,新增数据能够使用删除的大对象原空间,而无需对表空间进行扩容);
查询数据库中大于2G的对象并列举出来, or ,将数据库中指定的users表空间,top 50对象列举出来
SQL> select * from (select owner,segment_name,segment_type,tablespace_name,round(sum(bytes)/1024/1024/1024,2) "Gbytes"
from dba_segments where bytes>1024*1024*50 group by owner,segment_name,segment_type,tablespace_name) C1 where C1."Gbytes">2;
or
SQL> select rownum,C1.* from (select owner,segment_name,segment_type,tablespace_name,round(sum(bytes)/1024/1024/1024,2) "Gbytes"
from dba_segments where bytes>1024*1024*50 and tablespace_name='USERS' group by owner,segment_name,segment_type,tablespace_name order by 4,5) C1 where rownum<50;