system和sysaux表空间的回收

SYSAUX表空间被称为系统辅助表空间,是10g版本开始推出的新功能,主要的目的是为SYSTEM表空间减负,Oracle对SYSTEM表空间的维护有一套独立的体系,对SYSTEM表空间操作会占用额外的CPU资源,而且效率低下。

在10g版本,增加了SYSAUX辅助表空间,将EM、AWR等组件的表从SYSTEM表空间挪到了SYSAUX表空间中,这样大大减少了SYSTEM表空间的消耗,也减少了Oracle对SYSTEM表空间维护的成本。

查看表空间的使用率

SELECT * FROM (

  SELECT D.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 (  SELECT TABLESPACE_NAME,

                    ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,

                    SUM (BLOCKS) BLOCKS

               FROM DBA_DATA_FILES

           GROUP BY TABLESPACE_NAME) D,

          (  SELECT TABLESPACE_NAME,

                    ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE

               FROM DBA_FREE_SPACE

           GROUP BY TABLESPACE_NAME) F

    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)

   UNION ALL                                                           

   SELECT D.TABLESPACE_NAME,

          SPACE || 'M' "SUM_SPACE(M)",

          BLOCKS SUM_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 (  SELECT TABLESPACE_NAME,

                    ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,

                    SUM (BLOCKS) BLOCKS

               FROM DBA_TEMP_FILES

           GROUP BY TABLESPACE_NAME) D,

          (  SELECT TABLESPACE_NAME,

                    ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE,

                    ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE

               FROM V$TEMP_SPACE_HEADER

           GROUP BY TABLESPACE_NAME) F

    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)

   ORDER BY 1)  

   WHERE TABLESPACE_NAME IN ('SYSAUX','SYSTEM');

查看下使用SYSTEM和SYSAUX表空间的比较大的表有哪些。

SELECT *

  FROM (SELECT SEGMENT_NAME,

               SUM(BYTES) / 1024 / 1024 TOTAL_MB,

               TABLESPACE_NAME

          FROM DBA_SEGMENTS

         WHERE TABLESPACE_NAME IN  

               ('SYSTEM', 'SYSAUX')

         GROUP BY SEGMENT_NAME, TABLESPACE_NAME

         ORDER BY 2 DESC)

 WHERE ROWNUM <= 20;

大部分都是AUD$和WRH$开头的AWR基表,AUD$使用SYSTEM表空间,AWR的基表使用SYSAUX表空间,下面再查看下SYSAUX表空间的使用情况,可以通过v$sysaux_occupants视图查询到。

SELECT OCCUPANT_NAME "Item",

        SPACE_USAGE_KBYTES / 1048576 "Space Used (GB)",

        SCHEMA_NAME "Schema",

        MOVE_PROCEDURE "Move Procedure"

   FROM V$SYSAUX_OCCUPANTS

  ORDER BY 1;

可见SM/AWR组件就使用了较多的空间,也就是说审计和AWR占用了大量的SYSTEM和SYSAUX表空间,而这些数据是可以定期清理的,都没有必要保留太长的时间。

清理审计的数据,如果要保留部分AUD$里面记录的审计数据,可以把想要的数据插入到一张临时表,然后直接truncate这张表就可以了,truncate操作会直接回收AUD$占用的空间。回收下SYSAUX表空间,这个相对比较麻烦,也比较耗时。

如上文所示,通过查看v$sysaux_occupants视图,可以确定占用SYSAUX表空间过多的大部分都是AWR的基表,这样只要删除部分AWR数据理论上就可以回收一部分SYSAUX表空间,通常AWR的数据都会设置保留期限,10g版本默认保留7天,11g版本默认保留8天,可以通过dba_hist_wr_control视图来查看。

AWR的数据既然只保留七八天,为什么还会占用这么多的SYSAUX表空间呢?首先,AWR删除过期的数据是通过DELETE操作完成的,这样就会产生大量的碎片,特别是SYSAUX表空间存在自动扩展的数据文件,而且这个数据文件没有扩展到最大,还有扩展的空间情况下会很明显,其次就是ASH的数据有些情况下是不受AWR的保留策略影响的。

select count(*) from  WRH$_ACTIVE_SESSION_HISTORY;

select min(snap_id),max(snap_id) from  wrh$_active_session_history;

可以看到,ASH的数据从第一个快照开始一直都在保留,导致WRH$_ACTIVE_SESSION_HISTORY表很大,使用DBMS_WORKLOAD_REPOSITORY包清理过期或者不需要的AWR数据,可以回收这部分空间。

exec DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id =>1,high_snap_id => 1600);

清理了AWR数据之后,你会发现SYSAUX表空间的空间并没有被回收,使用率还和之前一样,这是因为清理AWR操作是通过DELETE操作实现的,表的水位线并没有下降导致的。

通过MOVE操作回收这个表的水位线,来回收这部分被删除数据占用的空间。这个表是分区表,分区表不支持表级别的MOVE操作,直接对分区表进行MOVE操作会遇到ORA-14511错误。

查看这个表的分区信息,只有两个分区

SELECT SEGMENT_NAME, PARTITION_NAME, BYTES / 1024 / 1024 / 1024 GB

  FROM DBA_SEGMENTS

 WHERE SEGMENT_NAME = 'WRH$_ACTIVE_SESSION_HISTORY';

下面按照分区进行MOVE操作,来回收空间。

alter table WRH$_ACTIVE_SESSION_HISTORY move partition WRH$_ACTIVE_SES_MXDB_MXSN;

alter table WRH$_ACTIVE_SESSION_HISTORY move partition WRH$_ACTIVE_2831053008_0;

对分区表进行MOVE之后,需要重建索引,查看这个表的索引信息。

select index_name from dba_indexes where table_name='WRH$_ACTIVE_SESSION_HISTORY';

这个表只有一个主键,而且是分区索引,也不能对分区索引直接进行REBUILD操作,否则会遇到ORA-14086错误。

alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild;

下面查看下这个索引的分区信息

select partition_name from dba_ind_partitions where index_name='WRH$_ACTIVE_SESSION_HISTORY_PK';

然后按照分区进行重建索引。

alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild partition WRH$_ACTIVE_2831053008_0;

alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild partition WRH$_ACTIVE_SES_MXDB_MXSN;

再次查看,WRH$_ACTIVE_SESSION_HISTORY的空间已经回收。

select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY';

select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY_PK';

既然已经删除了数据,那么如果不回收这部分空间,ORACLE就不会再使用这部分空间了吗?为什么非要回收呢?这个高水位线的问题主要影响以下几个方面,不只是使用SYSAUX表空间的表,对所有碎片较多的表都适用。

1.影响查询速度,因为这样的表本身比较大,索引也会很大,查询会很慢。

2.消耗资源,因为表和索引都很大,查询时会消耗很多I/O资源。

3.空间占用,虽然大部分数据被DELETE掉了,但是这部分空间仍旧是这个段(SEGMENT)的区(EXTENT),即使可以再利用也只能是这个表的新增数据才可以使用,而且还得是所在表空间无法自动扩展或者没有足够的扩展空间的情况下,如果表空间可以自动扩展或者有足够的扩展空间,那么还是不会使用这部分空间的,这就导致表和索引会越来越大,占用的空间越来越大,而一旦将可扩展的空间用尽,那么其他表将无法扩展,DELETE掉的数据空间,其他对象是无法使用的。

除了AWR的保留策略会影响SYSAUX表空间的使用率外,AWR收集数据的级别也对SYSAUX表空间的使用率影响很大,AWR收集数据的级别由statistics_level参数控制,这个参数有三个值,BASIC、TYPICAL、ALL,BASIC表示关闭统计信息收集,TYPICAL表示普通收集级别,只收集够日常用的统计信息,ALL是最给力的,凡是ORACLE能收集的所有信息都要收集,所以生成数据量会很大,相对来说,对性能和占用空间的影响也是最大的,通常TYPICAL就已经够用了。

不同的版本statistics_level参数的默认值不同,有的版本默认值为ALL,有的版本默认值为TYPICAL,建议调整为TYPICAL。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41561862/article/details/109131463