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

ORA-29289
2026년 10월 07일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-29289 directory access denied 는?

ORA-29289 에러는 Oracle 데이터베이스에서 디렉토리 오브젝트(Directory Object)에 대한 접근 권한이 없을 때 발생하는 오류입니다. 주로 UTL_FILE, DBMS_DATAPUMP, EXPDP/IMPDP, BFILE 등의 기능을 사용할 때 해당 디렉토리에 대한 READ 또는 WRITE 권한이 부여되지 않은 경우 발생합니다. 30년 현장 경험상 이 에러는 신규 개발 환경 구성 시나 계정 이관 작업 후 가장 빈번하게 나타나는 권한 관련 오류 중 하나입니다.


주요 발생 원인

1. Oracle Directory 오브젝트에 대한 권한 미부여

가장 흔한 원인으로, Oracle Directory 오브젝트는 생성 후 반드시 사용자에게 명시적으로 READ/WRITE 권한을 부여해야 합니다. DBA가 디렉토리를 생성했더라도 해당 디렉토리를 사용할 사용자 계정에 권한이 없으면 ORA-29289가 즉시 발생합니다. 특히 운영 환경에서 새로운 스키마나 애플리케이션 계정을 생성한 직후 이 문제가 자주 발생하므로 반드시 권한 부여 여부를 체크해야 합니다.

2. Oracle Directory 오브젝트 자체가 존재하지 않음

Oracle Directory 오브젝트는 실제 OS 경로를 데이터베이스 내에서 논리적으로 매핑한 오브젝트입니다. 해당 디렉토리 오브젝트가 DBA_DIRECTORIES 뷰에 등록되지 않았거나 오브젝트명을 잘못 입력한 경우에도 동일한 에러가 발생합니다. 또한 디렉토리명은 대소문자를 구별하지 않지만, 잘못된 이름을 참조하면 접근 거부로 이어지므로 오브젝트 존재 여부를 먼저 확인해야 합니다.

3. OS 레벨에서의 파일 시스템 권한 문제

Oracle Directory 오브젝트가 존재하고 DB 레벨 권한이 부여되어 있더라도, 실제 OS 파일 시스템 경로에 Oracle 프로세스(일반적으로 oracle 계정)가 접근할 수 없는 경우에도 이 에러가 발생할 수 있습니다. 특히 NFS 마운트 경로나 새로 생성된 디렉토리에 oracle OS 계정의 읽기/쓰기 권한이 없을 때 문제가 됩니다. OS 관리자와 협력하여 파일 시스템 권한을 반드시 함께 점검해야 합니다.


해결 방법

원인 1 해결: Directory 오브젝트에 권한 부여

먼저 현재 디렉토리 오브젝트 목록과 권한 현황을 조회합니다.

-- 현재 생성된 Directory 오브젝트 확인
SELECT directory_name, directory_path
FROM dba_directories
ORDER BY directory_name;

-- 특정 사용자에게 부여된 Directory 권한 확인
SELECT grantee, privilege, directory_name
FROM dba_tab_privs
WHERE type = 'DIRECTORY'
ORDER BY grantee, directory_name;

권한이 없는 경우 아래와 같이 DBA 계정으로 부여합니다.

-- 특정 사용자에게 READ 권한 부여
GRANT READ ON DIRECTORY data_dir TO app_user;

-- 특정 사용자에게 WRITE 권한 부여
GRANT WRITE ON DIRECTORY data_dir TO app_user;

-- READ/WRITE 동시 부여
GRANT READ, WRITE ON DIRECTORY data_dir TO app_user;

-- 권한 부여 확인
SELECT grantee, privilege, directory_name
FROM dba_tab_privs
WHERE directory_name = 'DATA_DIR'
  AND type = 'DIRECTORY';

원인 2 해결: Directory 오브젝트 생성

디렉토리 오브젝트가 존재하지 않는 경우, DBA 권한으로 생성합니다.

-- Directory 오브젝트 생성 (OR REPLACE로 기존 경로 덮어쓰기 가능)
CREATE OR REPLACE DIRECTORY data_dir AS '/oracle/data/export';

-- 생성 확인
SELECT directory_name, directory_path
FROM dba_directories
WHERE directory_name = 'DATA_DIR';

-- 생성 후 즉시 권한 부여
GRANT READ, WRITE ON DIRECTORY data_dir TO app_user;
GRANT READ, WRITE ON DIRECTORY data_dir TO scott;

원인 3 해결: UTL_FILE을 이용한 접근 테스트 및 OS 권한 점검

-- UTL_FILE을 이용한 디렉토리 쓰기 테스트
DECLARE
    v_file  UTL_FILE.FILE_TYPE;
BEGIN
    v_file := UTL_FILE.FOPEN('DATA_DIR', 'test_access.txt', 'W');
    UTL_FILE.PUT_LINE(v_file, 'Directory access test: ' || SYSDATE);
    UTL_FILE.FCLOSE(v_file);
    DBMS_OUTPUT.PUT_LINE('디렉토리 접근 성공');
EXCEPTION
    WHEN UTL_FILE.INVALID_DIRECTORY THEN
        DBMS_OUTPUT.PUT_LINE('에러: 디렉토리 오브젝트가 유효하지 않습니다.');
    WHEN UTL_FILE.INVALID_OPERATION THEN
        DBMS_OUTPUT.PUT_LINE('에러: OS 레벨 파일 시스템 권한을 확인하세요.');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러 코드: ' || SQLCODE || ' / 메시지: ' || SQLERRM);
END;
/

OS 레벨에서는 아래 명령으로 권한을 부여합니다 (서버 관리자 수행).

-- OS 레벨 권한 확인 및 부여 (Linux/Unix 환경, DBA가 OS 관리자에게 요청)
-- $ ls -ld /oracle/data/export
-- $ chown oracle:oinstall /oracle/data/export
-- $ chmod 755 /oracle/data/export

-- Data Pump 사용 시 권한 확인 예시
SELECT * FROM dba_directories WHERE directory_name = 'DATA_PUMP_DIR';
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO hr;

예방 방법

1. 디렉토리 생성 표준화 스크립트 운영

신규 스키마나 애플리케이션 계정 생성 시, 디렉토리 오브젝트 생성과 권한 부여를 하나의 표준 스크립트로 묶어 관리하면 누락을 방지할 수 있습니다. 아래와 같이 계정 생성 표준 절차에 디렉토리 권한 항목을 포함시켜 체크리스트화하는 것이 실무에서 가장 효과적인 방법입니다.

-- 신규 계정 생성 표준 스크립트 예시
CREATE USER new_app_user IDENTIFIED BY "SecurePass#1"
    DEFAULT TABLESPACE users
    TEMPORARY TABLESPACE temp;

GRANT CONNECT, RESOURCE TO new_app_user;

-- 디렉토리 권한은 계정 생성 직후 즉시 부여
GRANT READ, WRITE ON DIRECTORY data_dir TO new_app_user;
GRANT READ, WRITE ON DIRECTORY log_dir  TO new_app_user;

-- 권한 부여 결과 확인
SELECT grantee, privilege, directory_name
FROM dba_tab_privs
WHERE grantee = 'NEW_APP_USER'
  AND type = 'DIRECTORY';

2. 정기적인 디렉토리 권한 감사(Audit) 수행

분기별 또는 반기별로 DBA_DIRECTORIES와 DBA_TAB_PRIVS를 조인하여 디렉토리 오브젝트에 접근 권한을 가진 사용자 목록을 검토하고, 불필요한 권한은 즉시 회수하는 프로세스를 운영해야 합니다. 또한 Oracle Audit 기능을 활용하여 디렉토리 접근 이력을 기록해 두면 장애 발생 시 빠른 원인 분석에 도움이 됩니다.

-- 디렉토리 권한 전체 감사 쿼리
SELECT d.directory_name,
       d.directory_path,
       p.grantee,
       p.privilege,
       p.grantable
FROM   dba_directories d
LEFT JOIN dba_tab_privs p
       ON p.table_name = d.directory_name
      AND p.type = 'DIRECTORY'
ORDER BY d.directory_name, p.grantee;

관련 에러

  • ORA-29283: invalid file operation — 디렉토리 경로는 올바르나 파일 작업 자체가 유효하지 않을 때 발생하며 ORA-29289와 함께 자주 보임.
  • ORA-29280: invalid directory path — Directory 오브젝트의 OS 경로가 실제로 존재하지 않는 경우 발생.
  • ORA-39070: Unable to open the log file — Data Pump(EXPDP/IMPDP) 작업 중 로그 디렉토리 접근 실패 시 발생하며, 내부적으로 ORA-29289를 수반하는 경우가 많음.
  • ORA-01031: insufficient privileges — 보다 일반적인 권한 부족 에러로, 시스템 권한과 오브젝트 권한 모두를 점검해야 할 때 함께 확인할 것.

DBMS 에러 코드 시리즈

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

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

댓글 남기기