作为一名Oracle DBA,审计日志管理是日常运维中不可忽视的重要环节。审计日志记录了数据库中的所有关键操作,包括用户登录、DDL语句执行、权限变更等敏感行为。这些日志对于安全审计和故障排查至关重要,但如果不加以管理,会迅速占用大量存储空间,尤其是当审计功能全面开启时。
Oracle提供了两种主要的审计日志存储方式:
$ORACLE_BASE/admin/$ORACLE_SID/adump目录)首先需要确认当前数据库的审计配置方式,这决定了后续的清理策略:
sql复制SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB
常见的audit_trail参数值:
NONE:禁用审计功能OS:审计日志写入操作系统文件DB:审计日志写入数据库表SYS.AUD$DB,EXTENDED:除标准审计信息外,还包含SQL绑定变量等扩展信息当audit_trail设置为DB或DB,EXTENDED时,审计日志存储在SYS.AUD$表中:
sql复制SQL> select owner,table_name,tablespace_name
from dba_tables
where table_name='AUD$';
OWNER TABLE_NAME TABLESPACE_NAME
--------- ---------- ---------------
SYS AUD$ SYSTEM
注意:AUD$表默认存储在SYSTEM表空间,这可能导致SYSTEM表空间快速增长,影响数据库稳定性。
对于audit_trail=OS的情况,审计日志以.aud文件形式存储在操作系统目录中:
bash复制# 进入审计日志目录
cd $ORACLE_BASE/admin/$ORACLE_SID/adump
# 删除3个月前的审计文件(保留最近91天的日志)
find ./ -type f -name "*.aud" -mtime +91 -exec rm -f {} \;
# 一次性清空所有审计文件(谨慎使用)
find ./ -type f -name "*.aud" -exec rm -f {} \;
# 删除7天前的审计文件(更频繁的清理策略)
find ./ -mtime +7 -name "*.aud" -type f -delete
实操建议:建议使用第一种方式(保留最近3个月日志),既满足审计要求,又避免存储压力。生产环境慎用一次性清空操作。
对于audit_trail=DB的情况,清理SYS.AUD$表中的数据:
sql复制-- 简单清空审计表(不释放空间)
TRUNCATE TABLE SYS.AUD$;
-- 更彻底的清理方式(需要额外权限)
BEGIN
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
use_last_arch_timestamp => FALSE
);
END;
/
-- 对于大量数据,建议分批删除以避免undo压力
DELETE FROM SYS.AUD$ WHERE ROWNUM <= 100000;
COMMIT;
Oracle提供了DBMS_AUDIT_MGMT包来配置自动清理策略:
sql复制-- 初始化清理设置
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
default_cleanup_interval => 24 /* 小时 */
);
END;
/
-- 设置基于时间的清理策略(保留30天数据)
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
last_archive_time => SYSTIMESTAMP-30
);
END;
/
-- 创建定期清理作业
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_purge_interval => 24 /* 小时 */,
audit_trail_purge_name => 'AUDIT_TRAIL_PURGE_JOB',
use_last_arch_timestamp => TRUE
);
END;
/
sql复制-- 仅当前会话有效
ALTER SYSTEM SET audit_trail='NONE' SCOPE=MEMORY;
sql复制-- 修改参数文件设置(需重启生效)
ALTER SYSTEM SET audit_trail='NONE' SCOPE=SPFILE;
-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
-- 验证设置
SHOW PARAMETER audit_trail;
重要提示:生产环境不建议完全关闭审计功能,这会导致安全合规风险。建议配置合理的审计策略和清理机制。
为避免SYSTEM表空间膨胀,可将AUD$表迁移到专用表空间:
sql复制-- 创建专用表空间
CREATE TABLESPACE audit_ts
DATAFILE '/oracle/data/audit01.dbf' SIZE 1G AUTOEXTEND ON;
-- 迁移AUD$表
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,
audit_trail_location_value => 'AUDIT_TS'
);
END;
/
问题现象:AUD$表或审计文件目录迅速增长,占用大量空间。
解决方案:
sql复制SELECT * FROM dba_stmt_audit_opts;
SELECT * FROM dba_priv_audit_opts;
SELECT * FROM dba_obj_audit_opts;
问题现象:清理大AUD$表时数据库响应变慢。
解决方案:
问题现象:修改audit_trail参数后仍生成审计日志。
解决方案:
sql复制SHOW PARAMETER spfile;
sql复制SELECT * FROM dba_audit_mgmt_config_params;
存储策略选择:
表空间管理:
性能优化:
安全考虑:
监控与告警:
在实际运维中,我发现最有效的策略是结合业务需求配置精细化的审计策略,配合自动化的清理机制。例如,对关键业务表配置DDL审计和敏感数据访问审计,而对常规查询则不记录审计日志。同时,设置每周自动清理3个月前的审计数据,既满足合规要求,又避免存储压力。