프린트 하기

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)