Amazon RDS for Oracle DB 인스턴스에서 DMBS DATA PUMP API를 사용할 때 오류가 발생하는 이유는 무엇입니까?
Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스에서 DBMS_DATAPUMP를 사용하려고 하면 오류가 발생합니다.
간략한 설명
DMBS_DATAPUMP가 실패하는 이유는 다음과 같습니다.
- 사용자 권한 또는 역할 누락
- Oracle Data Pump Directory에 대한 읽기 및 쓰기 권한 누락
- 파일 권한 문제
- 소스 버전 및 대상 버전 비호환성 또는 표준 시간대 파일 버전 불일치
- DMBS_DATAPUMP PL/SQL 블록의 사소한 구문 오류
다음은 DMBS_DATAPUMP를 사용할 때 나타나는 일반적인 오류입니다.
- ORA-39001: 잘못된 인수 값
- ORA-31626: 작업이 존재하지 않음
- ORA-39002: 잘못된 작업
- ORA-39070: 로그 파일을 열 수 없음
해결 방법
다음 방법 중 하나를 사용하여 Oracle DB 인스턴스용 RDS를 가져오거나 내보낼 수 있습니다.
- Oracle Instant Client(expdp/impdp): 컴퓨터 또는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 클라이언트를 설치합니다. Oracle impdp 및 expdp 유틸리티를 사용하면 원격 호스트를 사용하여 명령줄에서 내보내기 및 가져오기 작업을 수행할 수 있습니다. 자세한 내용은 Oracle Instant Client를 사용하여 Amazon RDS for Oracle DB 인스턴스에 대한 Data Pump 가져오기 또는 내보내기를 실행하려면 어떻게 해야 합니까?를 참조하십시오.
- Data Pump API(DBMS_DATAPUMP): DBMS_DATAPUMP 패키지는 프로그래밍 방식으로 내보내기 및 가져오기를 수행할 수 있는 PL/SQL API를 제공합니다. Data Pump 작업을 시작하기 전에 모범 사례를 검토하십시오.
가져오기 또는 내보내기를 수행할 때 DBMS_DATAPUMP API 오류가 발생하면 다음 문제 해결 단계를 수행하십시오.
Data Pump 가져오기 로그 파일 내용에 오류가 있는지 검토
다음 SQL 명령을 실행하여 가져오기 로그 파일과 DB 알림에 오류가 있는지 검토합니다. DATA_PUMP_DIR 및 **<import log filename>**을 원하는 값으로 바꾸십시오.
-- View Import logs from DATA_PUMP_DIR directory. SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','<import log filename>'));
다음 SQL 문을 사용하여 BD 알림 로그에 액세스할 수도 있습니다.
SELECT message_text FROM alertlog;
사용자 권한 확인
내보내기 또는 가져오기 작업을 시작하기 전에 DB 사용자에게 충분한 권한이 있는지 확인해야 합니다. 자세한 내용은 Oracle 웹사이트에서 Oracle Data Pump 내보내기 및 가져오기 작업에 필요한 역할을 참조하십시오.
다음은 내보내기 또는 가져오기 작업을 실행하기 위한 최소 요구 사항입니다.
- CREATE SESSION
- CREATE TABLE
- 유효한 디렉터리 개체에 대한 READ 및 WRITE 개체 권한
- 사용자의 기본 테이블스페이스에 충분한 테이블스페이스 할당량
- 전체 데이터베이스 Data Pump 내보내기 작업을 실행하기 위한 DATAPUMP_EXP_FULL_DATABASE 데이터베이스 역할
- 전체 데이터베이스 Data Pump 가져오기 작업을 실행하기 위한 DATAPUMP_IMP_FULL_DATABASE 데이터베이스 역할
참고: 이러한 요구 사항은 Data Pump 내보내기 또는 가져오기 작업을 실행할 때 데이터베이스에 연결하는 사용자에게 적용됩니다. 내보내거나 가져온 사용자에게는 적용되지 않습니다.
부여된 역할과 기본 역할을 확인하려면 다음 SQL을 실행합니다. **<USERNAME>**을 Data Pump 작업을 실행할 때 데이터베이스에 연결하는 사용자 이름으로 바꾸십시오.
SELECT grantee, granted_role, default_role FROM dba_role_privs WHERE grantee IN ('<USERNAME>', 'PUBLIC') ORDER BY 1,2;
부여된 시스템 권한을 확인하려면 다음 명령을 실행합니다. **<USERNAME>**을 Data Pump 작업을 실행할 때 데이터베이스에 연결하는 사용자 이름으로 바꾸십시오.
SELECT grantee, privilege FROM dba_sys_privs WHERE (grantee IN ('<USERNAME>', 'PUBLIC') &einbsp; OR grantee IN (SELECT granted_role FROM dba_role_privs WHERE grantee IN ('<USERNAME>', 'PUBLIC'))) order by 1;
디렉터리에 대한 읽기 및 쓰기 권한 부여
디렉터리에 대한 읽기 및 쓰기 권한을 부여했는지 확인하려면 다음 명령을 실행합니다. **<USERNAME>**을 Data Pump 작업을 실행할 때 데이터베이스에 연결하는 사용자 이름으로 바꾸십시오.
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
덤프 및 로그 파일을 저장하는 데 사용하는 데이터베이스 디렉터리 확인
덤프 파일과 로그 파일을 저장하는 데 사용하는 데이터베이스 디렉터리가 있는지 확인합니다. DATA_PUMP_DIR 디렉터리를 사용하는 경우 다음과 유사한 명령을 실행하십시오.
select PRIVILEGE,TYPE from DBA_TAB_PRIVS where TABLE_NAME='DATA_PUMP_DIR' and GRANTEE='<USERNAME>';
Data Pump 내보내기 덤프 파일 확인
Data Pump 내보내기 덤프 파일이 있는지 확인하려면 다음과 유사한 명령을 실행하십시오.
SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) where FILENAME='dumpname.dmp';
호환성 행렬 확인
Oracle 웹사이트에서 여러 Oracle 버전 간의 Data Pump 호환성을 검토하십시오. 호환성 수준이 같거나 더 높은 데이터베이스로만 덤프 파일을 가져올 수 있습니다. 덤프 파일을 하위 버전의 대상 데이터베이스로 가져와야 할 수 있습니다. 이런 경우 내보내기 Data Pump VERSION 파라미터를 사용하여 대상 데이터베이스의 호환성 수준과 일치시키십시오. 자세한 내용은 Oracle 웹사이트에서 VERSION을 참조하십시오.
이 예제 명령에서는 VERSION 파라미터를 사용하여 대상 데이터베이스의 호환성을 일치시킵니다.
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null,version => '19.0.0.0'); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_src6.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER1'',''USER2'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /
소스의 표준 시간대 파일 버전이 대상의 버전보다 높은 경우 가져오기를 수행하면 다음과 같은 오류가 나타날 수 있습니다.
- ORA-39002: 잘못된 작업
- Ora-3905 : Oracle Data Pump는 XTSTZ 버전 XXX의 소스 데이터베이스에서 TSTZ 버전 XXX의 대상 데이터베이스로의 가져오기를 지원하지 않습니다.
이 문제를 해결하려면 소스 표준 시간대 파일 버전으로 대상 데이터베이스를 패치하거나 업데이트해야 합니다.
Oracle 표준 시간대 버전을 찾으려면 다음 쿼리를 실행합니다.
Select name,value$ from sys.props$ where name='DST_PRIMARY_TT_VERSION';
다운로드 작업 로그 파일 확인
Amazon Simple Storage Service(Amazon S3) 통합을 사용하여 덤프 파일을 다운로드한 경우 다운로드 작업 로그 파일을 확인하십시오. 덤프 파일이 오류 없이 복사되어야 합니다. 다음 명령을 실행하여 다운로드 작업 로그 파일을 확인합니다. task-id를 업로드 또는 다운로드 절차에서 반환한 작업 ID로 바꾸십시오.
SQL> SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')) where FILENAME like 'dbtask%' order by MTIME; SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-"task-id".log'));
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1611697375220-44.log'));
구문 오류 해결
일반적으로 사소한 구문 오류로 인해 Data Pump API 오류가 발생합니다. 데이터베이스의 구문 문제로 인해 발생하는 오류는 다음 예를 참조하십시오.
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'TestDumpfile.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'test_logfile.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''user1'',''user2'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; / Error report - ORA-39001: invalid argument value ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79 ORA-06512: at "SYS.DBMS_DATAPUMP", line 4929 ORA-06512: at "SYS.DBMS_DATAPUMP", line 6378 ORA-06512: at line 7 39001. 00000 - "invalid argument value" *Cause: The user specified API parameters were of the wrong type or value range. Subsequent messages supplied by DBMS_DATAPUMP.GET_STATUS will further describe the error.
이러한 오류를 해결하려면 다음 작업을 수행하십시오.
- 명령에 지정된 사용자, 테이블 및 개체가 데이터베이스에 있는지 확인합니다.
- 기존 덤프 파일의 이름이 명령에 지정된 이름과 동일한지 확인합니다.
- DBMS_DATAPUMP.ADD_FILE을 호출하기 전에 대상 위치에 덤프 파일이 존재하지 않는지 확인합니다. 덤프 파일이 있는 경우 해당 파일을 제거하십시오. 또는 모든 호출에 대해 파일 이름을 고유하게 만드십시오.
- 사용자 또는 스키마 이름은 대문자여야 합니다.
- API가 명령에서 dblink를 사용하는 경우 참조되는 데이터베이스 링크에 액세스할 수 있어야 합니다. 또한 DBMS_DATAPUMP API 호출에서 dblink 명령을 사용하기 전에 명령에서 쿼리를 실행할 수 있어야 합니다.
예외 처리를 사용하여 자세한 오류 메시지 캡처
일부 시나리오에서는 DBMS_DATAPUMP에서 자세한 정보를 제공하지 않는 일반적인 오류가 발생합니다. 예외 처리 블록을 사용하여 오류에 대한 추가 정보를 가져오십시오. 예외 처리 블록의 예는 Oracle 웹사이트에서 Data Pump API 사용 예를 참조하십시오.
자세한 오류 메시지의 정보를 기반으로 문제를 해결할 수 있습니다. 예를 들어 DATA_PUMP_DIR에 덤프 파일 이름이 이미 있는 경우 예외 블록에서 다음과 유사한 오류가 발생합니다.
"Exception in Data Pump job
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31641: unable to create dump file "/rdsdbdata/datapump/example3.dmp
ORA-27038: created file already exists
Additional information: 1"
스키마를 user1로 지정하면 예외 블록에서 다음과 유사한 오류가 발생합니다.
"Exception in Data Pump job
ORA-39001: invalid argument value
ORA-39170: Schema expression IN ('user1') does not correspond to any schemas."
Data Pump 작업 진행 상황 모니터링
DBA_DATAPUMP_JOBS 보기에는 Data Pump 내보내기 또는 가져오기 작업이 활성 상태인지 아니면 종료되었는지 표시됩니다. 또한 성공 또는 실패 상태도 함께 표시됩니다. Data Pump 가져오기 또는 내보내기에 대한 자세한 정보를 보려면 V$SESSION_LONGOPS 데이터 사전을 쿼리하십시오. 자세한 내용은 Oracle 웹사이트에서 DBA_DATAPUMP_JOBS 및 V$SESSION_LONGOPS를 참조하십시오.
예를 들어 다음 명령을 실행하면 Data Pump 작업의 현재 상태와 완료된 작업의 비율을 확인할 수 있습니다.
SELECT sl.sid, sl.serial#, sl.sofar, sl.totalwork, dp.owner_name, dp.state, dp.job_mode FROM v$session_longops sl, v$datapump_job dp WHERE sl.opname = dp.job_name AND sl.sofar != sl.totalwork;
관련 정보
Oracle 웹사이트의 DBMS_DATAPUMP
Oracle 웹사이트의 Data Pump API를 사용하는 기본 단계는 무엇입니까?
