審計日誌太多導致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不了資料庫)。