Oracle统一审计跟踪清理失败及审计日志无法写入问题求助
解决统一审计跟踪清理时的ORA-01578块损坏问题
看来你碰到了统一审计跟踪清理时的SYSAUX表空间块损坏问题,而且用dbms_repair标记坏块后没彻底解决,还影响了审计日志写入。我给你几个可行的解决思路,你可以根据实际情况尝试:
方案一:迁移损坏的AUDSYS内部表(无备份时优先尝试)
CLI_SWP$开头的表是AUDSYS的内部交换表,和统一审计的清理、写入逻辑强相关,标记坏块只是让Oracle跳过读取,但写入时仍可能访问到这些块,所以得替换掉损坏的表:
- 首先检查当前统一审计状态:
SELECT VALUE FROM V$PARAMETER WHERE NAME='unified_audit_enabled'; - 如果状态是
ENABLED,先禁用审计并重启数据库(注意:需确认业务允许,且不会违反合规要求):ALTER SYSTEM SET unified_audit_enabled=FALSE SCOPE=SPFILE; -- 执行完后重启数据库 - 确认损坏的目标表:
SELECT OWNER, TABLE_NAME FROM DBA_TABLES WHERE TABLE_NAME LIKE 'CLI_SWP$%' AND OWNER='AUDSYS'; - 跳过损坏块,将正常数据迁移到新表:
CREATE TABLE AUDSYS.CLI_SWP_NEW AS SELECT * FROM AUDSYS.CLI_SWP$80370d01$2$1 WHERE ROWID NOT IN ( SELECT ROWID FROM DBA_EXTENTS WHERE FILE_ID=19 AND BLOCK_ID<=299907 AND BLOCK_ID+BLOCKS-1>=299907 ); - 替换原表:
DROP TABLE AUDSYS.CLI_SWP$80370d01$2$1; ALTER TABLE AUDSYS.CLI_SWP_NEW RENAME TO CLI_SWP$80370d01$2$1; - 重新启用统一审计并重启:
ALTER SYSTEM SET unified_audit_enabled=TRUE SCOPE=SPFILE; -- 重启数据库 - 测试审计写入和清理操作:
BEGIN DBMS_AUDIT_MGMT.clean_audit_trail( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => TRUE ); END; /
方案二:用RMAN修复损坏块(有可用备份时优先)
如果你的数据库有RMAN备份,这是最稳妥的修复方式:
- 启动RMAN客户端,检查数据文件19的备份情况:
LIST BACKUP OF DATAFILE 19; - 执行块级恢复:
BLOCKRECOVER DATAFILE 19 BLOCK 299907; - 恢复完成后验证表结构:
ANALYZE TABLE AUDSYS.CLI_SWP$80370d01$2$1 VALIDATE STRUCTURE CASCADE; - 再尝试执行审计清理操作,验证是否解决问题。
方案三:重建AUDSYS用户(极端情况)
如果上述方案都失败,且你能接受重建AUDSYS的风险(需提前备份):
- 导出AUDSYS所有对象:
expdp system/your_password schemas=AUDSYS dumpfile=audsys_dump.dmp logfile=audsys_export.log - 禁用统一审计并重启数据库后,删除AUDSYS用户:
DROP USER AUDSYS CASCADE; - 重新创建AUDSYS用户(密码值可从DBA_USERS视图获取或参考Oracle官方文档):
CREATE USER AUDSYS IDENTIFIED BY VALUES 'S:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;H:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY;T:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' DEFAULT TABLESPACE SYSAUX TEMPORARY TABLESPACE TEMP; GRANT AUDIT_ADMIN, AUDIT_VIEWER TO AUDSYS; - 导入之前导出的AUDSYS对象:
impdp system/your_password schemas=AUDSYS dumpfile=audsys_dump.dmp logfile=audsys_import.log - 重新启用统一审计并测试功能。
重要注意事项
- 操作前必须做全库备份:比如用RMAN执行全备,避免操作失误导致数据丢失。
- 如果业务不允许重启数据库,可尝试用
DBMS_AUDIT_MGMT.set_audit_trail_location将审计跟踪转移到其他表空间,再处理SYSAUX的损坏块,但这个操作需确认Oracle版本支持。 - 标记坏块只是临时规避读取问题,无法解决写入失败的问题,必须彻底修复或替换损坏的表/块。
内容的提问来源于stack exchange,提问作者sriman narayana
相关产品推荐
相关产品推荐

