Oracle ORA-02002 오류 원인과 해결 방법 완벽 가이드

ORA-02002
2026년 08월 06일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-02002 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-02002 error while writing to audit trail 는?

ORA-02002 에러는 Oracle 데이터베이스가 감사(Audit) 레코드를 감사 추적(Audit Trail)에 기록하는 과정에서 실패했을 때 발생하는 에러입니다. Oracle의 감사 기능이 활성화된 환경에서 감사 로그를 저장하는 테이블스페이스나 파일 시스템에 문제가 생겼을 때 주로 나타납니다. 이 에러는 단순한 경고처럼 보일 수 있지만, 감사 기록이 누락되면 보안 컴플라이언스 위반으로 이어질 수 있어 즉각적인 조치가 필요합니다.


주요 발생 원인

1. SYSTEM 테이블스페이스 또는 감사 테이블스페이스의 공간 부족

가장 흔한 원인으로, Oracle의 전통적인 감사(Standard Audit) 기능은 감사 레코드를 SYS.AUD$ 테이블에 저장하는데, 이 테이블이 위치한 SYSTEM 테이블스페이스의 여유 공간이 부족하면 ORA-02002가 발생합니다. 특히 감사 대상 작업이 많은 운영 환경에서는 AUD$ 테이블이 빠르게 증가하여 SYSTEM 테이블스페이스를 가득 채우는 경우가 자주 발생합니다.

2. OS 레벨의 감사 파일 디렉토리 권한 또는 디스크 공간 문제

AUDIT_TRAIL 파라미터를 OS 또는 XML로 설정한 경우, Oracle은 감사 레코드를 운영체제 파일로 저장합니다. 이때 해당 디렉토리의 디스크 공간이 가득 찼거나, Oracle 프로세스가 해당 디렉토리에 쓰기 권한이 없으면 에러가 발생합니다. AUDIT_FILE_DEST 파라미터로 지정된 경로에 대한 권한 및 용량을 주기적으로 점검해야 합니다.

3. SYS.AUD$ 또는 SYS.FGA_LOG$ 테이블의 손상 또는 접근 불가

데이터베이스 내부적으로 감사 테이블 자체가 손상되었거나, 해당 테이블에 대한 락(Lock) 경합이 발생하면 쓰기 작업이 실패할 수 있습니다. Fine-Grained Auditing(FGA)을 사용하는 경우 SYS.FGA_LOG$ 테이블에 대한 동일한 문제가 발생할 수 있으며, 이 경우 해당 테이블의 상태를 직접 점검해야 합니다.


해결 방법

원인 1: SYSTEM 테이블스페이스 공간 부족 해결

먼저 현재 SYSTEM 테이블스페이스의 사용량을 확인합니다.

-- SYSTEM 테이블스페이스 사용량 확인
SELECT
    tablespace_name,
    ROUND(used_space * 8192 / 1024 / 1024, 2) AS used_mb,
    ROUND(tablespace_size * 8192 / 1024 / 1024, 2) AS total_mb,
    ROUND((1 - used_space / tablespace_size) * 100, 2) AS free_pct
FROM dba_tablespace_usage_metrics
WHERE tablespace_name = 'SYSTEM';

AUD$ 테이블의 크기를 확인하고, 오래된 감사 레코드를 정리합니다.

-- AUD$ 테이블 크기 확인
SELECT
    owner,
    segment_name,
    ROUND(bytes / 1024 / 1024, 2) AS size_mb
FROM dba_segments
WHERE segment_name IN ('AUD$', 'FGA_LOG$')
AND owner = 'SYS';

-- 90일 이전의 오래된 감사 레코드 삭제 (SYS 계정으로 실행)
DELETE FROM sys.aud$
WHERE timestamp# < SYSDATE - 90;
COMMIT;

-- 또는 DBMS_AUDIT_MGMT 패키지를 사용한 정리 (권장)
BEGIN
    DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
        audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
        use_last_arch_timestamp => FALSE,
        delete_percentage       => 30
    );
END;
/

감사 테이블을 SYSTEM 테이블스페이스가 아닌 별도 테이블스페이스로 이동하는 것도 근본적인 해결책입니다.

-- 감사 전용 테이블스페이스 생성
CREATE TABLESPACE audit_data
DATAFILE '/u01/oradata/orcl/audit_data01.dbf'
SIZE 2G
AUTOEXTEND ON NEXT 512M MAXSIZE 20G;

-- AUD$ 테이블을 전용 테이블스페이스로 이동
BEGIN
    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
        audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
        audit_trail_location_value => 'AUDIT_DATA'
    );
END;
/

원인 2: OS 파일 감사 디렉토리 문제 해결

감사 파일 대상 경로와 현재 설정을 확인합니다.

-- 현재 감사 설정 확인
SHOW PARAMETER audit_trail;
SHOW PARAMETER audit_file_dest;

-- 파라미터 조회
SELECT name, value
FROM v$parameter
WHERE name IN ('audit_trail', 'audit_file_dest', 'audit_sys_operations');

OS 레벨에서 디스크 공간 및 권한을 확인하고, 필요시 AUDIT_FILE_DEST 경로를 변경합니다.

-- audit_file_dest 경로 변경 (DB 재시작 불필요)
ALTER SYSTEM SET audit_file_dest = '/u02/audit_files' SCOPE=SPFILE;
-- 변경 후 데이터베이스 재시작 필요
SHUTDOWN IMMEDIATE;
STARTUP;

원인 3: AUD$ 테이블 점검 및 복구

-- AUD$ 테이블 상태 점검
ANALYZE TABLE sys.aud$ VALIDATE STRUCTURE CASCADE;

-- 테이블 통계 재수집
EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'AUD$', CASCADE => TRUE);

-- AUD$ 테이블에 대한 잠금 확인
SELECT
    s.sid,
    s.serial#,
    s.username,
    l.type,
    l.lmode,
    o.object_name
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
JOIN dba_objects o ON l.id1 = o.object_id
WHERE o.object_name = 'AUD$';

예방 방법

1. DBMS_AUDIT_MGMT를 활용한 자동 감사 로그 정리 스케줄 설정

감사 데이터가 무한정 쌓이는 것을 방지하기 위해 주기적인 자동 정리 Job을 설정하는 것이 Best Practice입니다. 아래와 같이 정리 인터벌을 설정하면 DBA의 수동 개입 없이도 감사 로그를 주기적으로 관리할 수 있습니다.

-- 감사 로그 자동 정리 초기화
BEGIN
    DBMS_AUDIT_MGMT.INIT_CLEANUP(
        audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
        default_cleanup_interval => 24  -- 24시간마다 정리
    );
END;
/

-- 마지막 아카이브 타임스탬프 설정 (30일 이전 데이터 정리 기준)
BEGIN
    DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
        audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
        last_archive_time => SYSDATE - 30
    );
END;
/

-- 자동 정리 Job 생성
BEGIN
    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
        audit_trail_type           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
        audit_trail_purge_interval => 24,
        audit_trail_purge_name     => 'AUDIT_PURGE_JOB',
        use_last_arch_timestamp    => TRUE
    );
END;
/

2. 감사 테이블스페이스 사용량 모니터링 알람 구성

SYSTEM 테이블스페이스 또는 감사 전용 테이블스페이스의 사용량이 임계치(예: 80%)를 초과하기 전에 알림을 받을 수 있도록 모니터링 스크립트를 구성하고, Oracle Enterprise Manager(OEM) 또는 사용자 정의 스크립트를 통해 주기적으로 점검해야 합니다.

-- 테이블스페이스 사용량 임계치 모니터링 스크립트 (cron job 또는 DBMS_SCHEDULER 연계)
SELECT
    tablespace_name,
    ROUND(used_space * 8192 / 1024 / 1024, 2) AS used_mb,
    ROUND(tablespace_size * 8192 / 1024 / 1024, 2) AS total_mb,
    ROUND(used_space / tablespace_size * 100, 2) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE ROUND(used_space / tablespace_size * 100, 2) > 80
AND tablespace_name IN ('SYSTEM', 'AUDIT_DATA');

관련 에러

  • ORA-00604: 재귀 SQL 레벨에서 오류 발생 — ORA-02002와 함께 나타나는 경우가 많으며, 감사 테이블 접근 중 내부 오류가 발생했음을 의미합니다.
  • ORA-01654: 인덱스 확장 실패 — AUD$ 테이블의 인덱스가 SYSTEM 테이블스페이스에서 확장되지 못할 때 함께 발생합니다.
  • ORA-00942: 테이블 또는 뷰가 존재하지 않음 — 감사 테이블 자체가 손상되거나 삭제된 경우 연관될 수 있습니다.
  • ORA-01536: 테이블스페이스에 대한 공간 할당량 초과 — 감사 전용 테이블스페이스의 쿼터가 부족한 경우 발생합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기