在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_STD、AUDIT_TRAIL_DB_STD、AUDIT_TRAIL_OS、AUDIT_TRAIL_XML、AUDIT_TRAIL_FILES和AUDIT_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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-631559/