Oracle11gr2 AUDIT清除功能增強(二)

yangtingkun發表於2010-04-07

11.2中,Oracle對於AUDIT記錄的清除工作進行了增強。

這一篇介紹將AUDIT記錄根據時間戳進行清除。

Oracle11gr2 AUDIT清除功能增強(一):http://yangtingkun.itpub.net/post/468/496990

 

 

Oracle提供的DBMS_AUDIT_MGMT包對於AUDIT記錄的清除和管理提供了強大的功能:

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
       580

SQL> SET SERVEROUT ON
SQL> BEGIN
  2  IF DBMS_AUDIT_MGMT.IS_CLEANUP_INITIALIZED(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
  3  DBMS_OUTPUT.PUT_LINE('INITIALIZED');
  4  ELSE
  5  DBMS_OUTPUT.PUT_LINE('NOT INITIALIZED');
  6  END IF;
  7  END;
  8  /
NOT INITIALIZED

PL/SQL 過程已成功完成。

SQL> EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE)
BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE); END;

*
1 行出現錯誤:
ORA-46258:
沒有為審計線索初始化清除
ORA-06512:
"SYS.DBMS_AUDIT_MGMT", line 61
ORA-06512:
"SYS.DBMS_AUDIT_MGMT", line 2333
ORA-06512:
line 1


SQL> EXEC DBMS_AUDIT_MGMT.INIT_CLEANUP(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 12)

PL/SQL 過程已成功完成。

SQL> EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE)

PL/SQL 過程已成功完成。

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
       580

SQL> EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, FALSE)

PL/SQL 過程已成功完成。

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
         0

如果要執行AUDIT的清理,必須執行INIT_CLEANUP過程,進行必要的AUDIT清理的準備工作,如果沒有執行INIT_CLEANUP,則會報錯ORA-46258

其中AUDIT_TRAIL_AUD_STD是指儲存在資料庫中的AUD$表中的TRAIL記錄,這裡可以指定的引數還包括AUDIT_TRAIL_FGA_STDAUDIT_TRAIL_DB_STDAUDIT_TRAIL_OSAUDIT_TRAIL_XMLAUDIT_TRAIL_FILESAUDIT_TRAIL_ALL

其中CLEAN_AUDIT_TRAIL過程的第二個引數就是指定是否根據時間戳來清理TRAIL,由於現在沒有指定時間戳,因此設定引數為TRUE,不會清理任何的記錄,而如果設定引數為FALSE,則全部的審計記錄被清除。

SQL> AUDIT CREATE TABLE;

審計已成功。

為了確保AUD$表中存在記錄,首先啟用AUDIT

SQL> CONN TEST/TEST
已連線。
SQL> CREATE TABLE T1 (ID NUMBER);
CREATE TABLE T1 (ID NUMBER)
             *
1 行出現錯誤:
ORA-00955:
名稱已由現有物件使用


SQL> DROP TABLE T1 PURGE;

表已刪除。

SQL> CREATE TABLE T1 (ID NUMBER);

表已建立。

SQL> CREATE TABLE T2 (ID NUMBER);

表已建立。

在另外的會話觸發AUDIT記錄。

回到初始會話,檢查AUD$記錄數:

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
         4

設定當前時間為AUD$記錄清除的時間戳:

SQL> SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;

TO_CHAR(SYSTIMESTAM
-------------------
2010-04-07 23:53:24

SQL> BEGIN
  2  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
  3  DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  TO_TIMESTAMP('2010-4-7 23:55', 'YYYY-MM-DD HH24:MI'));
  5  END;
  6  /

PL/SQL 過程已成功完成。

SQL> SELECT * FROM DBA_AUDIT_MGMT_LAST_ARCH_TS;

AUDIT_TRAIL          RAC_INSTANCE LAST_ARCHIVE_TS
-------------------- ------------ --------------------------------------------------
STANDARD AUDIT TRAIL            0 07-4
-10 11.55.00.000000 下午 +00:00

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
         4

需要注意,當前提供的時間戳被當作了0時區的時間戳,也就是說這些記錄要在8小時後才會被清除。8個小時後,在另外的會話再次建表:

SQL> CREATE TABLE T3 (ID NUMBER);

表已建立。

再次檢查AUD$記錄:

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
         5

現在存在5條記錄,其中4條記錄將會被清除:

SQL> EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, TRUE)

PL/SQL 過程已成功完成。

SQL> SELECT COUNT(*) FROM AUD$;

  COUNT(*)
----------
         1

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-631559/,如需轉載,請註明出處,否則將追究法律責任。

相關文章