暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

审计表迁移

原创 逆风飞翔 2021-11-03
1007

迁移操作步骤:

1)检查审计表现在所在的表空间

SQL>select table_name,tablespace_name from dba_tables where table_name in ('AUD$','FAG_LOG$') order by table_name;



2)检查两个表现在的数据量

SQL>select segment_name,bytes/1024/1024 size_in_megabytes from dba_segments where segment_name in ('AUD$','FAG_LOG$');



3)创建表空间

SQL>create tablespace AUD datafile size 10m autoextend on next 100m maxsize 32767m;

在日常的数据库维护中,经常出现SYSTEM表空间被撑满,在绝大多数情况下是因为数据库登录审计的功能被启动了,此时一般建议把SYS.AUD$相关对象迁移到其它表空间,从而避免SYSTEM被用完的风险。

在Oracle 11g之前迁移方法如下所示:

ALTER TABLE SYS.AUDIT$ MOVE TABLESPACE USERS;
ALTER TABLE SYS.AUDIT_ACTIONS MOVE TABLESPACE USERS;
ALTER TABLE SYS.AUD$ MOVE TABLESPACE USERS;
ALTER TABLE SYS.AUD$ MOVE LOB(SQLBIND) STORE AS SYS_IL0000000384C00041$$ (TABLESPACE USERS);
ALTER TABLE SYS.AUD$ MOVE LOB(SQLTEXT) STORE AS SYS_IL0000000384C00041$$ (TABLESPACE USERS);
ALTER INDEX SYS.I_AUDIT REBUILD ONLINE TABLESPACE USERS;
7ALTER INDEX SYS.I_AUDIT_ACTIONS REBUILD ONLINE TABLESPACE USERS;

从Oracle 11g开始可以使用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION进行迁移:

1EXEC DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(AUDIT_TRAIL_TYPE=> DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,AUDIT_TRAIL_LOCATION_VALUE => 'USERS');



如下示例为授予审计的一些权限:

GRANT AUDIT ANY TO LHR_TEST;
GRANT AUDIT SYSTEM TO LHR_TEST;



在Oracle 11g之前通过手工清理的方式或自定义作业来定期清理SYS.AUD$表,如下:

1TRUNCATE TABLE SYS.AUD$;
2DELETE FROM SYS.AUD$ WHERE OBJ$NAME='EMP';



需要注意的是,如果AUD$表过大,那么直接TRUNCATE AUD$表,系统要立即释放大量的EXTENTS,会严重影响系统性能。可以通过如下2个步骤逐步释放EXTENTS:

① 清空数据并且保留原来的EXTENTS:

1TRUNCATE TABLE SYS.AUD$ REUSE STORAGE;



在这里,REUSE STORAGE是TRUNCATE的一个参数,表示保持原来的存储不变。一般情况下,SQL命令“TRUNCATE TABLE TABLE_NAME;”其实就是“TRUNCATE TABLE TABLE_NAME DROP STORAGE;”。DROP STORAGE是TRUNCATE TABLE的默认参数。

② 逐步回缩EXTENTS:

ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 5000M;
ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 2000M;
……
ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 10M;



需要注意的是,在执行的时候,可以根据实际情况调整每次回缩空间的大小。

若审计在OS和XML选项下进行手动删除审计文件。在Oracle 11g中通过DBMS_AUDIT_MGMT包下的子过程进行手动或定期清理。下面的过程可以迁移审计记录到USERS表空间:

conn / as sysdba
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
AUDIT_TRAIL_LOCATION_VALUE => 'USERS');

END;
/


EXEC DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(AUDIT_TRAIL_TYPE=> DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,AUDIT_TRAIL_LOCATION_VALUE => 'USERS');
4)迁移

BEGIN

DBMS_AUDIT_MGMT.SET_AUDIT_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,audit_trail_location_value => 'AUD');

END;

/

aud表及FGA_LOG移动到新tablespace,&AUD_TBS_NAME表示新的表空间名
迁移AUD$表
BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_location_value => ‘&AUD_TBS_NAME’);
END;
/
迁移FGA_LOG$表
SQL> BEGIN
DBMS_AUDIT_MGMT.set_audit_trail_location(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD,
audit_trail_location_value => ‘&AUD_TBS_NAME’);
END;
/

具体要看你是想手动删除还是自己删除。手动删除应该不用说了,直接where条件中把时间带上就行。
自动删除的话,11g可设置自动清除审计记录,如:
BEGIN
DBMS_AUDIT_MGMT.init_cleanup(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
default_cleanup_interval => 120 /* hours */);
END;




select user_name,audit_option,success,failure from dba_stmt_audit_opts
 union
 select USER_NAME,privilege,success,failure from dba_priv_audit_opts;

select count(*) from DBA_AUDIT_TRAIL s WHERE s.action_name = 'CREATE USER' and s.username = 'SYSTEM';


因为第3步,这块可能会报下面的错:

ERROR at line 1:
ORA-46267: Insufficient space in AUD; tablespace, cannot complete operation
ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 1576
ORA-06512: at line 2
提示我们虽然表空间设置的是自动增长,但还是显示空间不足。

所以,在创建表空间时初始值设置成步骤2中所检查出的大小,如果数据过大,征求下客户意见,是不是可以truncate,然后再创建



5)检查迁移是否成功

SQL>select table_name,tablespace_name from dba_tables where table_name in ('AUD$','FAG_LOG$') order by table_name;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论