zoukankan      html  css  js  c++  java
  • [Oracle]Audit(二)--清理Audit数据

    上一篇,初步了解了Audit的作用以及如何使用Audit,本篇记录如何手动清理Audit数据。

    (一) 概述

    Audit的数据主要存储在sys.aud$表中,该表默认位于system表空间中,我们根据需求,将该表移到了sysaux表空间中。由于审计数据量较大,需要经常关注sysaux表空间的使用情况,同时根据实际情况对sys.aud$表进行数据清理。

    (二) 清理步骤

    (1)使用sys账号登陆数据库,打开计时功能,方便查看每一个命令的执行时间

    SQL> set timing on

    (2)在清理数据之前先查看数据量大小

    SQL> select count(*) from sys.aud$;

    (3)查看Audit表中最早一笔数据的时间,即审计表中记录的最早的时间

    SQL> select min(ntimestamp#) from sys.aud$;
    MIN(NTIMESTAMP#)
    ----------------------------------------
    23-11月-16 08.18.54.496893 上午

    (4)查看审计数据最后归档时间,只有归档的数据才能删除

    SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts;
    AUDIT_TRAIL   RAC_INSTANCE   LAST_ARCHIVE_TS
    -----------   ------------   --------------------------------
    STANDARD AUDIT TRAIL     0   14-3月 -17 01.22.49.000000 下午 +00:00

    (5)初始化清理Audit的功能,该命令只有在第一次执行时需要运行,default_cleanup_interval =>168代表清理周期为168小时。

    SQL> 
    BEGIN
          sys.DBMS_AUDIT_MGMT.init_cleanup(
          audit_trail_type         => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
          default_cleanup_interval => 168);
    END;
    /

    (6)确认清除Audit功能是否开启,yes为开启

    SQL>
    SET SERVEROUTPUT ON
    BEGIN
    IF sys.DBMS_AUDIT_MGMT.is_cleanup_initialized(sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
         DBMS_OUTPUT.put_line('YES');
       ELSE
         DBMS_OUTPUT.put_line('NO');
       END IF;
      END;
    /

    (7)设置需要清理的天数,最后一个数字‘7’代表清理‘7’天前的数据(归档时间大于等于清除时间)

    SQL> 
    BEGIN
          sys.DBMS_AUDIT_MGMT.set_last_archive_timestamp(
          audit_trail_type  => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
          last_archive_time => SYSTIMESTAMP-7 /* Day */);
    END;
    /

    (8) 执行清除,时间长短受数据量大小影响(经测试600万条数据大约20分钟)

    SQL> 
    BEGIN
          sys.DBMS_AUDIT_MGMT.clean_audit_trail(
          audit_trail_type        => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
          use_last_arch_timestamp => TRUE);
    END;
    /

    (9)在清理后,sys.aud$表的大小并没有发生改变,需要收回空间

    解释:在上面清理表sys.aud$后,实际上,数据还在磁盘上,只是数据不受保护了而已,其空间并没有释放,需要将其释放回收

    SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; --查看aud$的大小
    SEGMENT_NAME                                                                     BYTES/1024/1024
    -------------------------------------------------------------------------------- ---------------
    AUD$                                                                                        3456
    
    SQL> alter table sys.aud$ enable row movement;   --激活行移动
    Table altered.
    
    SQL> 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$';  ----再次查看aud$的大小
    
    SEGMENT_NAME                                                                     BYTES/1024/1024
    -------------------------------------------------------------------------------- ---------------
    AUD$                                                                                    666.8125

    经过2次查看空间大小,可以看到空间已经被释放。

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/lijiaman/p/6736376.html
Copyright © 2011-2022 走看看