OS환경 : Oracle Linux 7.2 (64bit)
DB 환경 : Oracle Database 12.2.0.1
에러 : ORA-46385: DML and DDL operations are not allowed on table "AUDSYS"."AUD$UNIFIED".
audit 기록 테이블인 AUDSYS 유저의 AUD$UNIFIED을 truncate 시키려고 할 때 발생한 에러
1 2 3 4 5 6 | SQL> truncate table AUDSYS.AUD$UNIFIED; truncate table AUDSYS.AUD$UNIFIED * ERROR at line 1: ORA-46385: DML and DDL operations are not allowed on table "AUDSYS"."AUD$UNIFIED". |
해결 방법 : DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 을 이용해 삭제한다
삭제하려면 아래 명령을 사용해야함
먼저 삭제 전 SET_LAST_ARCHIVE_TIMESTAMP로 백업
1 2 3 4 5 6 7 8 9 | SQL> begin DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE=>DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, LAST_ARCHIVE_TIME=>sysdate-6/24); end; / PL/SQL procedure successfully completed. |
CLEAN_AUDIT_TRAIL로 삭제
1 2 3 4 5 6 7 8 9 | SQL> begin DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE=>DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, USE_LAST_ARCH_TIMESTAMP=>TRUE); end; / PL/SQL procedure successfully completed. |
이방법은 timestamp 기준으로 삭제해서 audit 이 남아 있을 수 있음
남아있는 audit 확인
1 2 3 4 5 6 7 8 | SQL> select unified_audit_policies,action_name,count(*) from unified_audit_trail group by unified_audit_policies,action_name; UNIFIED_AUDIT_POLICIES ACTION_NAME COUNT(*) ---------------------- ---------- ---------- ORA_SECURECONFIG UNDROP OBJECT 1 |
모두 삭제
1 2 3 4 5 6 7 8 9 | SQL> begin DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( AUDIT_TRAIL_TYPE=>DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, USE_LAST_ARCH_TIMESTAMP=>false); end; / PL/SQL procedure successfully completed. |
다시 확인
1 2 3 4 5 6 7 8 9 | SQL> select unified_audit_policies,action_name,count(*) from unified_audit_trail group by unified_audit_policies,action_name; UNIFIED_AUDIT_POLICIES ACTION_NAME COUNT(*) ---------------------- ---------- ---------- EXECUTE 1 |
모두 지워지고 EXCUTE 한 기록만 남아있음
또는 db를 upgrade mode로 startup 한뒤에 truncate 명령을 사용하면 에러가 발생하지 않음
db 종료
1 2 3 4 | SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. |
upgrade mode로 startup
1 2 3 4 5 6 7 8 9 10 | SQL> startup upgrade; ORACLE instance started. Total System Global Area 1660944384 bytes Fixed Size 8621376 bytes Variable Size 989856448 bytes Database Buffers 654311424 bytes Redo Buffers 8155136 bytes Database mounted. Database opened. |
AUDSYS.AUD$UNIFIED 테이블 truncate 시도
1 2 3 | SQL> truncate table AUDSYS.AUD$UNIFIED; Table truncated. |
다시 재기동 후 확인
1 2 3 4 5 6 7 8 | SQL> shutdown immediate SQL> startup SQL> select unified_audit_policies,action_name,count(*) from unified_audit_trail group by unified_audit_policies,action_name; no rows selected |
원인 : AUD$UNIFIED는 민감한, 통합 감사 내부 테이블이기 때문에 기본적으로 DDL이 막혀있음
AUDSYS.AUD$UNIFIED는 민감한 테이블 / 통합 감사 내부 테이블이므로 외부 DDL 및 DML은 허용되지 않음
참조 :
https://blog.dbi-services.com/purging-unified-audit-trail-in-12cr2/
(Doc ID 2307747.1)