当前位置: 首页 > 科技观察

分享一个Oracle数据库标准SYSAUX表空间清理方案

时间:2023-03-17 23:52:14 科技观察

概述SYSAUX表空间称为系统辅助表空间,是10g版本引入的新功能。主要目的是减轻SYSTEM表空间的负担。空间维护有独立的系统,对SYSTEM表空间的操作会占用额外的CPU资源,效率低下。在10g版本中,增加了SYSAUX辅助表空间,将EM、AWR等组件的表从SYSTEM表空间移动到SYSAUX表空间,大大减少了SYSTEM表空间的消耗,也减少了Oracle的维护SYSTEM表空间。成本。下面介绍一下最近清理sysaux表空间的过程,仅供参考。1.查询SYSTEM和SYSAUX表空间的使用率SELECT*FROM(SELECTD.TABLESPACE_NAME,SPACE||'M'"SUM_SPACE(M)",BLOCKS"SUM_BLOCKS",SPACE-NVL(FREE_SPACE,0)||'M'"USED_SPACE(M)",ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2)||'%'"USED_RATE(%)",FREE_SPACE||'M'"FREE_SPACE(M)"FROM(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2)SPACE,SUM(BLOCKS)BLOCKSFROMDBA_DATA_FILESGROUPBYTABLESPACE_NAME)D,(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2)FREE_SPACEFROMDBA_FREE_TABLE_TABLEBNAME).TABLESPACE_NAME=F.TABLESPACE_NAME(+)UNIONALLSELECTD.TABLESPACE_NAME,SPACE||'M'"SUM_SPACE(M)",BLOCKSSUM_BLOCKS,USED_SPACE||'M'"USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2)||'%'"USED_RATE(%)",NVL(FREE_SPACE,0)||'M'"FREE_SPACE(M)"FROM(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2)SPACE,SUM(BLOCKS)BLOCKSFROMDBA_TEMP_FILESGROUPBYTABLESPACE_NAME)D,(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2)USED_SPACE,ROUND(SUM(BYTES_FREE)/(1024*1024),2)FREE_SPACEFROMV$TEMP_SPACE_HEADERGROUPBYTABLESPACE_NAME)FWHERED.TABLESPACE_NAME=F.TABLESPACE_NAME(+)ORSPACESINTAY1,'WHERED'SYSTEM');可以看到SYSAUX表空间使用了43GB左右,SYSTEM表空间使用了3GB左右。)/1024/1024total_mb,tablespace_namefromdba_segmentswheretablespace_namein('SYSTEM','SYSAUX')groupbysegment_name,tablespace_nameorderby3desc)whererownum<=20;可以看出大部分大表都是AUD$和WRH$开头的AWR基表,AUD$使用的是SYSTEM表空间,AWR的基表使用的是SYSAUX表空间3.查看SYSAUX表空间的具体用法这里您可以通过v$sysaux_occupants视图查询SELECToccupant_name"Item",space_usage_kbytes/1048576"SpaceUsed(GB)",schema_name"Schema",move_procedure"MoveProcedure"FROMv$sysaux_occupantsORDERBYspace_usage_kbytesdesc;可以看到SM/AWR组件使用了40GB的SYSAUX表空间,也就是说auditing和AWR占用了大量的SYSTEM和SYSAUX表空间,而这些数据可以定期清理,所以不需要保留时间太长了。通过查看v$sysaux_occupants视图,可以确定大部分SYSAUX表空间被AWR的基表占用。这样,只要删除一些AWR数据,理论上就可以恢复一部分SYSAUX表空间。通常,AWR数据会有一个保留期。10g版本默认预留7天,11g版本默认预留8天。可以通过dba_hist_wr_control视图查看(注意:并不是所有DBA开头的表都是数据字典,很多都是视图,dba_hist_wr_control就是视图)。问题来了,AWR既然数据只保留了七八天,为什么还要占用那么多SYSAUX表空间呢?这个问题其实有两个原因。首先AWR通过DELETE操作删除过期数据,会产生大量碎片,尤其是SYSAUX表空间有一个自动扩展的数据文件,这个数据文件没有扩展到最大,有的时候会很明显仍有扩展空间。其次,ASH数据在某些情况下不受AWR保留策略的影响。.4.使用dbms_workload_repository.drop_snapshot_range删除历史数据(不推荐)--ASH数据从第一次快照开始一直保留,导致WRH$_ACTIVE_SESSION_HISTORY表很大,使用DBMS_WORKLOAD_REPOSITORY包--清理过期或不需要的AWR数据,可以返回这部分空间selectcount(*)fromWRH$_ACTIVE_SESSION_HISTORY;selectmin(snap_id),max(snap_id)fromwrh$_active_session_history;execDBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id=>1,high_snap_id=>25100);selectmin(snap_id)fromwrh$_active_session_history;execDBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id=>1,high_snap_id=>25100);selectmin(snap_id),max(snap_id)fromwrh$_ACTIVES_COUNT(*)清理AWR数据后,可以发现SYSAUX表空间中的空间并没有被回收,使用率还是和之前一样。这是因为AWR操作的清理是通过DELETE操作实现的,表的水位还没有下降。5、手动生成truncate需要执行selectdistinct'truncatetable'||segment_name||';',s.bytes/1024/1024MBfromdba_segmentswheres.segment_namelike'WRH$%'andsegment_typein('TABLEPARTITION','TABLE')ands.bytes/1024/1024>100orderbys.bytes/1024/1024desc;实际执行sql:通过上面的语句,可以看到基本上所有的segment都是以WRH$_开头的,这几类segments基本都和AWR有关,如下ExecutetruncatetableWRH$_SQL_BIND_METADATAassysuser;——保存AWR收集SQLbindinginformationtabletruncatetableWRH$_ACTIVE_SESSION_HISTORY;——保存AWR收集历史session信息表selectsegment_name,partition_name,bytes/1024/1024/1024gbfromdba_segmentswheresegment_namein('WRH',$CH','WRH$_SQLSTAT');altertableWRH$_LATCHtruncatepartitionWRH$3391_350_357;altertableWRH$_SQLSTATtruncatepartitionWRH$_SQLSTA_1013373590_0;truncatetableWRI$_ADV_SQLT_PLANS;—保存AWR收集SQL建议计划信息表altertableWRH$_SYSSTATshrinkspace;alterindexWRH$_SYSSTAT_PKshrinkspace;altertableWRH$_LATCHshrinkspace;altertableWRH$_SEG_STATshrinkspace;altertableWRH$_SQLSTATshrinkspace;altertableWRH$_PARAMETERshrinkspace;——SaveAWRcollectionparameterinformation信息表alterindexWRH$_PARAMETER_PKshrinkspace;truncatetableWRH$_EVENT_HISTOGRAM;truncatetableWRH$_SQL_PLAN;——保存AWR收集的SQL执行计划表truncatetableWRH$_SQLTEXT;——保存AWR收集的SQL文本表6.验证是否符合要求,完成