1. 程式人生 > >審計日誌太多導致Oracle系統表空間佔滿的處理

審計日誌太多導致Oracle系統表空間佔滿的處理

1.檢視所有表空間資訊(包括總大小、已使用、空閒、使用百分比):
select a.tablespace_name,total "Total(M)",free "Free(M)",total-free "Used(M)",round(((total-free)/total)*100,2) "Used(%)" from 
( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files
   group by tablespace_name) a, 
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
   group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;

查詢結果:
TABLESPACE_NAME    Total(M)    Free(M)    Used(M)    Used(%)
---------- ---------- ---------- ----------
MY_TABLESPACES   30720 30718.8125     1.1875          0
SYSAUX           880    70.0625   809.9375      92.04
UNDOTBS1         8720    8695.25      24.75        .28


TABLESPACE_NAME  Total(M)    Free(M)    Used(M)    Used(%)
---------- ---------- ---------- ----------
USER_DATA2      50         49          1          2
USERS           187.5    183.375      4.125        2.2
SYSTEM          10960      15.25   10944.75      99.86


TABLESPACE_NAME   Total(M)    Free(M)    Used(M)    Used(%)
---------- ---------- ---------- ----------
EXAMPLE          100      21.25      78.75      78.75
USER_DATA        15600  5081.5625 10518.4375      67.43

2.檢視物理表空間的使用資訊:
SELECT A.TABLESPACE_NAME,B.TOTAL/1024/1024||'M',(B.TOTAL-A.USE)/1024/1024||'M' FREE FROM
(
select TABLESPACE_NAME,sum(bytes) as USE from dba_segments
where tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')
 GROUP BY TABLESPACE_NAME
) A ,
(
WITH TABLESPACE_TOTAL AS
(
SELECT tablespace_name,sum(MAXBYTES) TOTAL FROM DBA_DATA_FILES T
 WHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')
AND T.AUTOEXTENSIBLE='YES' group by tablespace_name
UNION ALL
SELECT tablespace_name,sum(bytes) TOTAL FROM DBA_DATA_FILES T
WHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')
AND T.AUTOEXTENSIBLE='NO' group by tablespace_name
)
SELECT TABLESPACE_NAME,SUM(TOTAL) TOTAL FROM TABLESPACE_TOTAL GROUP BY TABLESPACE_NAME
) B
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME;

查詢結果:
TABLESPACE_NAME  B.TOTAL/1024/1024||'M'  FREE  
--------------------------------------------------------------------------------
MY_TABLESPACES  32767.984375M  32767.796875M
EXAMPLE  32767.984375M  32690.234375M

TABLESPACE_NAME  B.TOTAL/1024/1024||'M'  FREE
--------------------------------------------------------------------------------
USER_DATA  30720M  20201.3125M

這個命令看不到系統表空間SYSTEM的資訊,SYSTEM可以直接檢視檔案.dbf大小:
ls -lh $ORACLE_HOME
-rw-r----- 1 oracle dba  11G May  3 12:25 system01.dbf

如果你的系統表空間SYSTEM佔用比較多的空間,可能有以下幾方面的原因:
(1)沒有為使用者明確指定預設表空間,導致system系統表空間作為使用者預設表空間
(2)開啟了審計,請檢查此表的大小AUD$
你可以執行以下查詢來檢查一下系統表空間哪些表比較大:
select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='SYSTEM' group by segment_name) where sx>100 order by sx desc; 


檢視該表紀錄數
select count(*) total from AUD$;


3.查看錶空間對應的檔名
select file_name from dba_data_files where tablespace_name='SYSTEM';
/opt/oracle/oradata/orcl/system01.dbf

解決方法大概有下面幾種:
1.重新調整SYSTEM表空間的物理資料檔案的大小:
alter database datafile '/opt/oracle/oradata/orcl/system01.dbf' autoextend on;
alter database datafile '/opt/oracle/oradata/orcl/system01.dbf' resize 10240M;
注意:單檔案最大支援32G。如果表空間超過32G,需要新增資料檔案。


2.為SYSTEM表空間另外新增一個數據檔案:
alter tablespace system add datafile '/opt/oracle/oradata/orcl/system02.dbf' size 10240M;

3.truncate掉AUD$表、並關閉審計功能:

truncate table AUD$;
alter system set audit_trail=none scope=spfile;
showdown immediate;
startup;

注意:使用這種方法,效果立竿見影。如果不關閉此功能,需要定期清理此表。

4.將AUD$預設表空間由system移出。

建立遷移AUD$的普通表空間:
create tablespace records 
datafile '/opt/oracle/oradata/orcl/auds01.dbf' size 10G autoextend on; 
 
遷移到目標表空間:
BEGIN
  DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'AUDS');
END;
/

查詢所屬表空間
select OWNER, TABLE_NAME, TABLESPACE_NAME from DBA_TABLES where TABLE_NAME = 'AUD$' and OWNER = 'SYS'; 

----------------

Oracle審計日誌清理

資料庫安裝後資料庫審計開關預設設定為DB(audit_trail=DB,如果為其他值則表示被認為設定過):
SQL> show parameter audit_trail; 
Name       TYPE     VALUE 
----------------------------------- 
audit_trail   string     DB

audit_trail=DB時Oracle會把每次審計跟蹤記錄在資料庫的的AUD$的表中。

預設情況下,AUD$這張表所在的表空間,是Oracle最重要的SYSTEM表空間:
SQL> select owner,table_name,tablespace_name from dba_tables a where a.table_name ='AUD$'; 
OWNER        TABLE_NAME        TABLESPACE_NAME
--------------------------------------------------------------
SYS                AUD$                    SYSTEM

通常情況下,SYSTEM表空間都會設定為自動擴充套件(AUT=YES):
SQL> select a.tablespace_name,a.bytes,a.autoextensible from dba_data_files a where a.tablespace_name='SYSTEM'; 

TABLESPACE_NAME        BYTES              AUT
--------------------------------------------------------
SYSTEM                          1.1492E+10    YES  

因此,時間長了以後,SYSTEM表空間最終會把磁碟撐爆。


管理審計日誌

進入審計日誌目錄:
cd $ORACLE_BASE/例項名/$ORACLE_SID/adump
例如:ls $ORACLE_BASE/admin/orcl/adump

僅保留30天的檔案,其他的都刪除
find ./ -type f -name "*.aud" -mtime +31 |xargs rm -f

如果不保留、也可以刪除所有審計檔案
find ./ -type f -name "*.aud" |xargs rm -f
find ./ -type f -name "*.aud" –delete

設定審計引數關閉:
SQL> alter system set audit_trail=none scope=spfile;
SQL> shutdown immediate;
SQL> startup;

注意:雖然關閉了審計,但Oracle還有一個叫強制審計的功能。如果操作者用SYSDBA/SYSOPER許可權登入資料庫,進行startup、shutdown等操作,Oracle依然會給你在$ORACLE_BASE/admin/$ORACLE_SID/adump目錄中記.aud的檔案。
因此:開了DB功能,會同時將審計日誌記在AUD$表中和作業系統aud檔案中。時間長了以後,除了存SYSTEM表空間吧磁碟撐爆的風險外,還存在審計檔案太多導致系統inodes耗盡的風險。
如果設定為NONE,仍然會而且毫無其他辦法的將記錄在作業系統aud檔案中。

如果系統inodes被耗盡,資料庫會報錯:
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 28: No space left on device
Additional information: 9925

檢視審計日誌記錄的表名和審計檔案的系統目錄:
SQL> show parameter audit;
預設的資料庫的表為:sys.aud$,作業系統目錄為:$ORACLE_BASE/admin/例項名/adump/

最後:
1.如果為DB,請定期清空aud$表:
SQL> truncate table sys.aud$;

2.如果不用DB功能,可以設定關閉:
SQL> alter system set audit_trail=none scope=spfile;
SQL> shutdown immediate;
SQL> startup;

3.如果為NONE,請定期清空aud檔案或者配置crontab定時任務定時清空aud檔案(清空時不要直接刪除adump目錄,會導致sqlplus不了資料庫)。