system01.dbf文件过大——SYSTEM表空间AUD$使用空间过大问题处理

巡检时发现oracle数据库的system01.dbf数据文件超大,有32G大小,下面对system01.dbf进行排查占用大的问题及缩小空间


1、检查system表空间中占用空间最大对象

SELECT * FROM (SELECT SEGMENT_NAME, SUM(BYTES) / 1024 / 1024 MB FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = 'SYSTEM' GROUP BY SEGMENT_NAME ORDER BY 2 DESC) WHERE ROWNUM < 10;

s1.jpg

aud$为审计功能

或用下面语句查看更详细些

查看system表空间中各个段占用空间的情况:

SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, SUM(BYTES)/1024/1024  FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = 'SYSTEM' and rownum<20 GROUP BY OWNER, SEGMENT_NAME, SEGMENT_TYPE ORDER BY 4;


2、截断占用空间最大的AUD$表(需要确认审计信息是否需要保留):

---查看该表的大小:

SQL> select TABLE_NAME,NUM_ROWS,BLOCKS*8192/1024/1024/1024 from dba_tables where table_name='AUD$';

SQL>  select bytes/1024/1024/1024  from dba_segments where segment_name='AUD$';

image.png


---清除aud$的数据

SQL> truncate table sys.AUD$; 或 truncate table aud$;清除都可
Table truncated.


SQL> select bytes/1024/1024/1024  from dba_segments where segment_name='AUD$';
BYTES/1024/1024/1024
--------------------
.000061035


---查看system表空间的大小

SQL> SELECT a.tablespace_name, a.bytes/1024/1024/1024  total, b.bytes/1024/1024/1024 used, c.bytes free, (b.bytes * 100) / a.bytes "% USED ", (c.bytes * 100) / a.bytes "% FREE " FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = c.tablespace_name and a.tablespace_name='SYSTEM';

image.png

* system空间已回收,可根据审计文件信息是否需要,如若需要部分审计信息可用delete删除


3、更改AUD$表的表空间为其他表空间(视情况而定)

BEGIN  
 DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,     AUDIT_TRAIL_LOCATION_VALUE => '&AUD_TBS_NAME');  
END;


4、若确认不需要审计,直接将审计功能关闭

alter system set audit_trail=none scope=spfile;

需要重启才生效


5、释放system01.dbf文件占用空间

---查询可以计算出来一个数据文件可以resize到的大小:

select a.file#, a.name, 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.name||''' resize '|| ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD 
from   v$datafile a, 
       ( select file_id, max(block_id+blocks-1) HWM 
         from   dba_extents 
         group by file_id) b 
where  a.file# = b.file_id(+) and (a.bytes - HWM *block_size)>0 order by 5;
     FILE#
----------
NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
 CURRENTMB   RESIZETO  RELEASEMB
---------- ---------- ----------
RESIZECMD
------------------------------------------------------------------------------------------------------------------------------------------------------
         1
/u01/app/oracle/oradata/utf8/system01.dbf
     32730 1277.99219 31452.0078
alter database datafile '/u01/app/oracle/oradata/utf8/system01.dbf' resize 1278M;

---然后执行下列语句,system01文件即可到释放到1G的空间

alter database datafile '/u01/app/oracle/oradata/utf8/system01.dbf' resize 1278M;

猜你喜欢

转载自blog.51cto.com/meiling/2483056