手动清理Oracle审计记录

Oracle 数据库审计功能非常强大,通常包括标准审计(包括用户级审计和系统级审计)和细粒度审计。尽管如此,一不小心就容易造成性能问题。同时会把系统表空间给撑爆。下面的内容描述的是如何将审计从系统表空间剥离以及清理Oracle审计记录,供大家参考。

一、审计的相关配置

--环境
SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

SQL> show parameter audit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /home/oraprod/app/product/11.2
                                                 .0/dbhome_1/rdbms/audit
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      DB  --此值为当前Oracle 11gR2缺省配置

--从下面的查询中可以看出,当前的审计位于system表空间
SQL> col segment_name FOR a10
SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name =‘AUD$‘;

OWNER                          SEGMENT_NA TABLESPACE_NAME
------------------------------ ---------- ------------------------------
SYS                            AUD$       SYSTEM

二、修改审计存储表空间

新增一个表空间用于存储审计日志
SQL> CREATE tablespace audit_data datafile ‘/home/oracle/app/oradata/orcl/audit01.dbf‘
  2  SIZE 100M autoextend ON NEXT 50M;

SQL> @tbs_free.sql

TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR
------------------------------ -------- -------- -------- ------
AUDIT_DATA                            1    1,199    1,200  100 %
SYSAUX                            1,133       77    1,210    6 %
SYSTEM                            1,875       15    1,890    1 %

-- 设定审计数据存放表空间
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
  3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_LOCATION_VALUE => ‘AUDIT_DATA‘
  5    );
  6  END;
  7  /
BEGIN
*
ERROR at line 1:
ORA-46267: Insufficient space in ‘AUDIT_DATA‘ tablespace, cannot complete
operation
ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 1576
ORA-06512: at line 2
-- 错误提示,尽管我们使用了自动扩展表空间,依旧提示空间不够

-- 查看当前审计数据大小,如下为1152MB
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name=‘AUD$‘;

SEGMENT_NAME              BYTES/1024/1024
------------------------- ---------------
AUD$                                 1152

-- 下面调整数据文件大小
SQL> alter database datafile ‘/home/oracle/app/oradata/orcl/audit01.dbf‘ resize 1200m;

Database altered.

-- 再次设定审计数据存放表空间OK
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
  3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_LOCATION_VALUE => ‘AUDIT_DATA‘
  5    );
  6  END;
  7  /

PL/SQL procedure successfully completed.

Elapsed: 00:02:23.10
--整个过程花费了2m23s,主要是期间进行了数据搬迁

SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name =‘AUD$‘;

OWNER                          SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SYS                            AUD$                           AUDIT_DATA

SQL> @tbs_free.sql

TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR
------------------------------ -------- -------- -------- ------
AUDIT_DATA                        1,153       47    1,200    4 %
SYSAUX                            1,143       67    1,210    6 %
SYSTEM                              724    1,166    1,890   62 %

-- 从上面的这个查询可以看出,原来位于system表空间的AUD$被迁移到了AUDIT_DATA
-- 相应地AUDIT_DATA表空间已使用增加,而SYSTEM表空间使用率下降

-- 查看审计数据字典配置信息
SQL> col PARAMETER_NAME FOR a30
SQL> col PARAMETER_VALUE FOR a15
SQL> col AUDIT_TRAIL FOR a20
SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL
  2  FROM DBA_AUDIT_MGMT_CONFIG_PARAMS
  3  WHERE audit_trail = ‘STANDARD AUDIT TRAIL‘;

PARAMETER_NAME                 PARAMETER_VALUE AUDIT_TRAIL
------------------------------ --------------- --------------------
DB AUDIT TABLESPACE            AUDIT_DATA      STANDARD AUDIT TRAIL
DB AUDIT CLEAN BATCH SIZE      10000           STANDARD AUDIT TRAIL

三、清除审计记录

通过这个过程设定清除间隔
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.init_cleanup(
  3      audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
  4      default_cleanup_interval => 120 /* hours */);
  5  END;
  6  /

PL/SQL procedure successfully completed.

-- 下面严验证审计日志清除是否已开启
SQL> SET SERVEROUTPUT ON
SQL> BEGIN
  2    IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
  3      DBMS_OUTPUT.put_line(‘YES‘);
  4    ELSE
  5      DBMS_OUTPUT.put_line(‘NO‘);
  6    END IF;
  7  END;
  8  /
YES

PL/SQL procedure successfully completed.

SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name=‘AUD$‘;

SEGMENT_NAME        BYTES/1024/1024
------------------- ---------------
AUD$                           1152

SQL> select ‘Leshami‘ As author,‘http://blog.csdn.net/leshami‘ as Blog from dual;

AUTHOR  BLOG
------- ----------------------------
Leshami http://blog.csdn.net/leshami

SQL> select count(*) from AUD$;

  COUNT(*)
----------
   5908086

SQL> select min(ntimestamp#) from aud$;

MIN(NTIMESTAMP#)
---------------------------------------------------------------------------
20-AUG-14 06.11.09.901253 AM

-- 设定归档间隔
SQL> BEGIN
  2  DBMS_AUDIT_MGMT.set_last_archive_timestamp(
  3  audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  last_archive_time => SYSTIMESTAMP-10);
  5  END;
  6  /

PL/SQL procedure successfully completed

--查看设定的归档间隔
SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts;

AUDIT_TRAIL          RAC_INSTANCE LAST_ARCHIVE_TS
-------------------- ------------ ---------------------------------------------------------------------------
STANDARD AUDIT TRAIL            0 09-OCT-15 01.27.17.000000 PM +00:00

--通过调用DBMS_AUDIT_MGMT.clean_audit_trail进行手动清理审计日志
BEGIN
  DBMS_AUDIT_MGMT.clean_audit_trail(
   audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
   use_last_arch_timestamp => TRUE);
END;
/

DBMS_AUDIT_MGMT.clean_audit_trail
This procedure deletes audit trail records. The CLEAN_AUDIT_TRAIL procedure is usually called after the
SET_LAST_ARCHIVE_TIMESTAMP Procedure has been used to set the last archived timestamp for the audit records.

--也可以通过创建一个purge Job来进行清理已归档的历史审计记录
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
  3      AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,
  5      AUDIT_TRAIL_PURGE_NAME     => ‘Daily_Audit_Purge_Job‘,
  6      USE_LAST_ARCH_TIMESTAMP    => TRUE
  7    );
  8  END;
  9  /

PL/SQL procedure successfully completed.

-- 本次测试使用了job进行清理,注,上面的purge job 并非使用DBMS_SCHEDULER.CREATE_JOB创建
-- 执行job用于清理归档,通过观察,由于redo log size为50MB,切换较为频繁,花费了19分钟
-- 同时伴随有Checkpoint not complete等待事件,可见redo size过小
SQL> exec DBMS_SCHEDULER.RUN_JOB(job_name => ‘SYS.DAILY_AUDIT_PURGE_JOB‘);

PL/SQL procedure successfully completed.

Elapsed: 00:19:26.38

SQL> select count(*) from AUD$;

  COUNT(*)
----------
        12

--经查看,清理后空间并没有释放
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name=‘AUD$‘;

SEGMENT_NAME                   BYTES/1024/1024
------------------------------ ---------------
AUD$                                      1152

SQL> alter table sys.aud$ shrink space cascade;
alter table sys.aud$ shrink space cascade
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled

SQL> alter table sys.aud$ enable row movement;

Table altered.

SQL> alter table sys.aud$ shrink space cascade;

Table altered.

SQL> alter table sys.aud$ disable row movement;

Table altered.

-- 下面的查询可以看到,空间已经被释放
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name=‘AUD$‘;

SEGMENT_NAME         BYTES/1024/1024
-------------------- ---------------
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非常规方式来处理。

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。

时间: 2024-08-25 09:36:13

手动清理Oracle审计记录的相关文章

利用脚本自动清理Oracle归档日志

背景 由于Oracle数据库开启了归档模式,经常因为归档日志文件占用空间过大而导致数据库无法正常连接,发现问题后需要手动清理归档日志,而发现问题时可能已经过去很长时间了,在生产环境中对用户的使用有非常严重的影响. 项目中涉及到多方数据对接,对数据库的频繁插入和更新会生成大量的归档日志,归档日志空间是500G,大概一周左右的时间归档日志空间就100%. 为解决这个问题这里使用脚本+定时任务自动清理归档日志,只保留5天归档. 归档日志清理脚本 #!/bin/bash #Author wangchen

如何手动创建oracle数据库

下面的实验室是如何不要通过DBCA创建ORACLE 数据库,而是通过ORACLE ONLINE HELP DOCUMENT进行手动的创建数据库的详细步骤: 1,编辑Oracle profile [[email protected] ~]# su - oracle [[email protected] ~]$ vi ./.bash_profile PATH=$PATH:$HOME/bin export PATH export ORACLE_BASE=/u01/app/oracle export O

清理Oracle安装目录里的一些日志信息

最近测试环境服务器上磁盘空间紧张,表空间里面的数据也不知道开发哪些需要哪些不需要,而且因为此测试库运行时间比较久远,起码有三年了.于是就从清理Oracle安装目录下的日志下手. 发现在一般这几个日志,如果没有做定期清理的话,就比较占空间. 1.<user_dump_dest>/alert_<sid>.log 2.$ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_<hostname>_<SID>/log/http-web-access

手动创建oracle数据库_oracle11g

通过手动创建oracle数据库,可以了解oracle数据库的结构和数据库运行机制,对理解oracle数据库有帮助. 一.打开命令行工具,创建必要有相关目录 mkdir E:\app\Administrator\admin\sky mkdir E:\app\Administrator\admin\sky\adump mkdir E:\app\Administrator\admin\sky\dpdump mkdir E:\app\Administrator\admin\sky\pfile mkdir

java 手动清理缓存的方法

有时候会感觉代码如何也查不出问题,可是缓存就是清好几遍了 这个时候就试试手动清理缓存 到你的编译路径下面 E:\java-workspace\wem\work\org\apache\jsp 手动删除你的文件目录下面的运行的文件就行了 ,系统再次运行会再次编译的

手动删除oracle数据库

oracle数据库sqldatabaseloggingfile –===================== – 手动删除oracle数据库 –===================== 在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库.对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库 的具体步骤,包含文件系统数据库以及ASM数据库.环境:Oracle Enterprise Linux 5.4 + Oracle 10g R2 . 一.手动删除

手动清理垃圾测试

手动清理垃圾测试 1 package com.fry.FinalizeTest; 2 3 public class FinalizeTest extends java.lang.Object{ 4 @Override 5 protected void finalize() throws Throwable { 6 // TODO Auto-generated method stub 7 super.finalize(); 8 System.out.println("The object is g

怎样手动创建oracle数据库

以下的实验室是怎样不要通过DBCA创建ORACLE 数据库,而是通过ORACLE ONLINE HELP DOCUMENT进行手动的创建数据库的具体步骤: 1,编辑Oracle profile [[email protected] ~]# su - oracle [[email protected] ~]$ vi ./.bash_profile PATH=$PATH:$HOME/bin export PATH export ORACLE_BASE=/u01/app/oracle export O

手动清理C盘空间

Win7系统随着使用C盘空间会越来越小,可以使用安全卫士等工具清理系统垃圾,也可以手动删除不必要文件释放C盘空间. 安全删除休眠文件 hiberfil.sys 作为隐藏的系统文件,大小与物理内存一致,当电脑进入休眠状态时,Windows7在关闭系统前将所有的内存内容写入hiberfil.sys文件:但是系统恢复后该文件不会被删除,所以需要手动删除: 以管理员身份运行cmd,输入:powercfg -h off 也可以在取消隐藏属性之后直接删除文件. 2.减小或者取消虚拟内存 如果物理内存足够大(