/ 中存储网

Oracle审计记录手动清理的方法

2017-07-06 20:33:05 来源:中存储

Oracle 数据库审计功能非常强大,通常包括标准审计(包括用户级审计和系统级审计)和细粒度审计。尽管如此,一不小心就容易造成性能问题。同时会把系统表空间给撑爆。

下面的内容描述的是如何将审计从系统表空间剥离以及清理Oracle审计记录,供大家参考。

一、审计的相关配置

  1. --环境 

  2. SQL> select * from v$version where rownum=1; 
  3.  
  4. BANNER 
  5. -------------------------------------------------------------------------------- 
  6. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 
  7.  
  8. SQL> show parameter audit 
  9.  
  10. NAME                                 TYPE        VALUE 
  11. ------------------------------------ ----------- ------------------------------ 
  12. audit_file_dest                      string      /home/oraprod/app/product/11.2 
  13.                                                  .0/dbhome_1/rdbms/audit 
  14. audit_sys_operations                 boolean     FALSE 
  15. audit_syslog_level                   string 
  16. audit_trail                          string      DB  --此值为当前Oracle 11gR2缺省配置 
  17.  
  18. --从下面的查询中可以看出,当前的审计位于system表空间 
  19. SQL> col segment_name FOR a10 
  20. SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name ='AUD$'; 
  21.  
  22. OWNER                          SEGMENT_NA TABLESPACE_NAME 
  23. ------------------------------ ---------- ------------------------------ 
  24. SYS                            AUD$       SYSTEM 

二、修改审计存储表空间 

  1. 新增一个表空间用于存储审计日志 
  2. SQL> CREATE tablespace audit_data datafile '/home/oracle/app/oradata/orcl/audit01.dbf' 
  3.   2  SIZE 100M autoextend ON NEXT 50M; 
  4.  
  5. SQL> @tbs_free.sql 
  6.  
  7. TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR 
  8. ------------------------------ -------- -------- -------- ------ 
  9. AUDIT_DATA                            1    1,199    1,200  100 % 
  10. SYSAUX                            1,133       77    1,210    6 % 
  11. SYSTEM                            1,875       15    1,890    1 % 
  12.  
  13. -- 设定审计数据存放表空间   
  14. SQL> BEGIN 
  15.   2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( 
  16.   3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  17.   4      AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_DATA' 
  18.   5    ); 
  19.   6  END; 
  20.   7  / 
  21. BEGIN 
  22. ERROR at line 1: 
  23. ORA-46267: Insufficient space in 'AUDIT_DATA' tablespace, cannot complete 
  24. operation 
  25. ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 1576 
  26. ORA-06512: at line 2 
  27. -- 错误提示,尽管我们使用了自动扩展表空间,依旧提示空间不够 
  28.  
  29. -- 查看当前审计数据大小,如下为1152MB 
  30. SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; 
  31.  
  32. SEGMENT_NAME              BYTES/1024/1024 
  33. ------------------------- --------------- 
  34. AUD$                                 1152 
  35.  
  36. -- 下面调整数据文件大小 
  37. SQL> alter database datafile '/home/oracle/app/oradata/orcl/audit01.dbf' resize 1200m; 
  38.  
  39. Database altered. 
  40.  
  41. -- 再次设定审计数据存放表空间OK  
  42. SQL> BEGIN 
  43.   2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( 
  44.   3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  45.   4      AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_DATA' 
  46.   5    ); 
  47.   6  END; 
  48.   7  / 
  49.  
  50. PL/SQL procedure successfully completed. 
  51.  
  52. Elapsed: 00:02:23.10 
  53. --整个过程花费了2m23s,主要是期间进行了数据搬迁 
  54.  
  55. SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name ='AUD$'; 
  56.  
  57. OWNER                          SEGMENT_NAME                   TABLESPACE_NAME 
  58. ------------------------------ ------------------------------ ------------------------------ 
  59. SYS                            AUD$                           AUDIT_DATA 
  60.  
  61. SQL> @tbs_free.sql 
  62.  
  63. TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR 
  64. ------------------------------ -------- -------- -------- ------ 
  65. AUDIT_DATA                        1,153       47    1,200    4 % 
  66. SYSAUX                            1,143       67    1,210    6 % 
  67. SYSTEM                              724    1,166    1,890   62 % 
  68.  
  69. -- 从上面的这个查询可以看出,原来位于system表空间的AUD$被迁移到了AUDIT_DATA 
  70. -- 相应地AUDIT_DATA表空间已使用增加,而SYSTEM表空间使用率下降 
  71.  
  72. -- 查看审计数据字典配置信息 
  73. SQL> col PARAMETER_NAME FOR a30 
  74. SQL> col PARAMETER_VALUE FOR a15 
  75. SQL> col AUDIT_TRAIL FOR a20 
  76. SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL 
  77.   2  FROM DBA_AUDIT_MGMT_CONFIG_PARAMS 
  78.   3  WHERE audit_trail = 'STANDARD AUDIT TRAIL'; 
  79.  
  80. PARAMETER_NAME                 PARAMETER_VALUE AUDIT_TRAIL 
  81. ------------------------------ --------------- -------------------- 
  82. DB AUDIT TABLESPACE            AUDIT_DATA      STANDARD AUDIT TRAIL 
  83. DB AUDIT CLEAN BATCH SIZE      10000           STANDARD AUDIT TRAIL 

三、清除审计记录

  1. 通过这个过程设定清除间隔 
  2. SQL> BEGIN 
  3.   2    DBMS_AUDIT_MGMT.init_cleanup( 
  4.   3      audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL, 
  5.   4      default_cleanup_interval => 120 /* hours */); 
  6.   5  END; 
  7.   6  / 
  8.  
  9. PL/SQL procedure successfully completed. 
  10.  
  11. -- 下面严验证审计日志清除是否已开启 
  12. SQL> SET SERVEROUTPUT ON 
  13. SQL> BEGIN 
  14.   2    IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN 
  15.   3      DBMS_OUTPUT.put_line('YES'); 
  16.   4    ELSE 
  17.   5      DBMS_OUTPUT.put_line('NO'); 
  18.   6    END IF; 
  19.   7  END; 
  20.   8  / 
  21. YES 
  22.  
  23. PL/SQL procedure successfully completed. 
  24.  
  25. SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; 
  26.  
  27. SEGMENT_NAME        BYTES/1024/1024 
  28. ------------------- --------------- 
  29. AUD$                           1152 
  30.  
  31. SQL> select 'Leshami' As author,'http://blog.csdn.net/leshami' as Blog from dual; 
  32.  
  33. AUTHOR  BLOG 
  34. ------- ---------------------------- 
  35. Leshami http://blog.csdn.net/leshami 
  36.  
  37. SQL> select count(*) from AUD$; 
  38.  
  39.   COUNT(*) 
  40. ---------- 
  41.    5908086 
  42.  
  43. SQL> select min(ntimestamp#) from aud$; 
  44.  
  45. MIN(NTIMESTAMP#) 
  46. --------------------------------------------------------------------------- 
  47. 20-AUG-14 06.11.09.901253 AM 
  48.  
  49. -- 设定归档间隔 
  50. SQL> BEGIN 
  51.   2  DBMS_AUDIT_MGMT.set_last_archive_timestamp( 
  52.   3  audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  53.   4  last_archive_time => SYSTIMESTAMP-10); 
  54.   5  END; 
  55.   6  / 
  56.  
  57. PL/SQL procedure successfully completed 
  58.  
  59. --查看设定的归档间隔 
  60. SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts; 
  61.  
  62. AUDIT_TRAIL          RAC_INSTANCE LAST_ARCHIVE_TS 
  63. -------------------- ------------ --------------------------------------------------------------------------- 
  64. STANDARD AUDIT TRAIL            0 09-OCT-15 01.27.17.000000 PM +00:00 
  65.  
  66. --通过调用DBMS_AUDIT_MGMT.clean_audit_trail进行手动清理审计日志 
  67. BEGIN 
  68.   DBMS_AUDIT_MGMT.clean_audit_trail( 
  69.    audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  70.    use_last_arch_timestamp => TRUE); 
  71. END; 
  72.  
  73. DBMS_AUDIT_MGMT.clean_audit_trail 
  74. This procedure deletes audit trail records. The CLEAN_AUDIT_TRAIL procedure is usually called after the  
  75. SET_LAST_ARCHIVE_TIMESTAMP Procedure has been used to set the last archived timestamp for the audit records. 
  76.  
  77. --也可以通过创建一个purge Job来进行清理已归档的历史审计记录 
  78. SQL> BEGIN 
  79.   2    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB( 
  80.   3      AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, 
  81.   4      AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */, 
  82.   5      AUDIT_TRAIL_PURGE_NAME     => 'Daily_Audit_Purge_Job', 
  83.   6      USE_LAST_ARCH_TIMESTAMP    => TRUE 
  84.   7    ); 
  85.   8  END; 
  86.   9  / 
  87.  
  88. PL/SQL procedure successfully completed. 
  89.  
  90. -- 本次测试使用了job进行清理,注,上面的purge job 并非使用DBMS_SCHEDULER.CREATE_JOB创建 
  91. -- 执行job用于清理归档,通过观察,由于redo log size为50MB,切换较为频繁,花费了19分钟 
  92. -- 同时伴随有Checkpoint not complete等待事件,可见redo size过小 
  93. SQL> exec DBMS_SCHEDULER.RUN_JOB(job_name => 'SYS.DAILY_AUDIT_PURGE_JOB'); 
  94.  
  95. PL/SQL procedure successfully completed. 
  96.  
  97. Elapsed: 00:19:26.38 
  98.  
  99. SQL> select count(*) from AUD$; 
  100.  
  101.   COUNT(*) 
  102. ---------- 
  103.         12 
  104.  
  105. --经查看,清理后空间并没有释放         
  106. SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; 
  107.  
  108. SEGMENT_NAME                   BYTES/1024/1024 
  109. ------------------------------ --------------- 
  110. AUD$                                      1152 
  111.  
  112. SQL> alter table sys.aud$ shrink space cascade; 
  113. alter table sys.aud$ shrink space cascade 
  114. ERROR at line 1: 
  115. ORA-10636: ROW MOVEMENT is not enabled 
  116.  
  117. SQL> alter table sys.aud$ enable row movement; 
  118.  
  119. Table altered. 
  120.  
  121. SQL> alter table sys.aud$ shrink space cascade; 
  122.  
  123. Table altered. 
  124.  
  125. SQL> alter table sys.aud$ disable row movement; 
  126.  
  127. Table altered. 
  128.  
  129. -- 下面的查询可以看到,空间已经被释放 
  130. SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; 
  131.  
  132. SEGMENT_NAME         BYTES/1024/1024 
  133. -------------------- --------------- 
  134. AUD$                           .0625 

四、小结

a、对于Oracle 11g,审计功能默认被开启,因此如果在必须启用的情况下应考虑性能影响; 
b、开启审计的情况下,建议将审计从system或sysaux表空间剥离,使用单独的表空间; 
c、对于历史审计日志的清除,应考虑清除期间所带来的性能影响; 
d、调用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION这个过程已经开始了搬迁过程,如果审计日志很庞大,应考虑IO影响; 
e、审计日志的清除需要先设定归档,已归档的审计日志会被清理; 
f、也可以通过trunate table aud$ reuse storage以及deallocate非常规方式来处理。