본문 바로가기

AWS(Amazon Web Service)

DBMS_DATAPUMP 사용법과 예제

기존 On-Premise Oracle 서버에서는 expdp 명령어를 많이 사용했으나, AWS RDS를 사용하면서 expdp명령어의 제약으로 인해 DBMS_DATAPUMP를 사용합니다. 스키마 전체를 이관하거나, Metadata 만 이관하거나, 특정 테이블만 이관하는 다양한 경우에 대해 알아봅니다. DBMS_DATAPUMP의 사용방법 및 다양한 예시를 모아봤습니다.

 

DBMS_DATAPUMP EXPORT

SCHEMA 모드 ⇒ job_mode = ‘SCHEMA’

가장 일반적인 Export 하기(덤프파일명, 로그파일명, 스키마이름 변경 후 실행)

해당 계정의 스키마 및 데이터 모두 포함

-- IBE 계정의 모든 오브젝트 EXPORT
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125.DMP', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125.LOG', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''IBE'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

 

압축/병렬 처리

-- 압축 용량이 줄어드나, 소요시간이 3배정도 소요
DBMS_DATAPUMP.SET_PARAMETER( handle => hdnl, name => 'compression', value => 'ALL');

-- 병렬 처리(Enterprise Edition에서만)
 DBMS_DATAPUMP.SET_PARALLEL( handle => hdnl, degree => 3);

 

Metadata Only

-- Metadata Only(데이터없이 스키마, Porcedure, Function등 프로그램 이관)
dbms_datapump.data_filter(handle => hdnl, name => 'INCLUDE_ROWS', value => 0);

 

두 개 이상의 스키마 이관

DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''IBE'',''IBE2'')');

TABLE 모드 ⇒ job_mode => ‘TABLE’

해당 계정의 특정 테이블(TABLE1, TABLE2, TABLE3)을 제외하고 나머지 테이블만 EXPORT

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'TABLE', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125_EXCEPT_PARTITION.DMP', directory => 'DDUMP', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125_EXCEPT_PARTITION.LOG', directory => 'DDUMP', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''IBER'')');
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'NAME_EXPR','NOT IN (''TABLE1'',''TABLE2'',''TABLE3'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

 

특정 테이블만 EXPORT

DBMS_DATAPUMP.METADATA_FILTER(hdnl,'NAME_EXPR','IN (''TABLE1'',''TABLE2'',''TABLE3'')');

 

 

DBMS_DATAPUMP IMPORT

-- IBE 계정의 모든 오브젝트 IMPORT
DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125.DMP', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'IBE_231125.LOG', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''IBE'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

 

REMAP_TABLESPACE 테이블 스페이스 이름이 변경이 필요할 경우

-- 테이블스페이스가 미리 있어야함
DBMS_DATAPUMP.METADATA_REMAP(hdnl,'REMAP_TABLESPACE','IBE01_Tablespace','TS_IBE_D');

 

특정테이블 제외하고 IMPORT

-- 특정 테이블을 제외하고 Export 받은 파일을 이용해서 TABLE모드로 IMPORT
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'TABLE', job_name=>null);

 

파티션 테이블을 더 이상 사용하지 않을 경우 MERGE 하여 IMPORT

(Oracle Standard버전에서 파티션 기능을 지원하지 않음)

-- MERGE
DBMS_DATAPUMP.SET_PARAMETER(hdnl,'PARTITION_OPTIONS','MERGE');

 

위 예시로 대부분의 EXPORT, IMPORT가 가능할 것 같습니다. 이용 시 참고하시기 바랍니다.

 

 

참고자료

Oracle의 DBMS_DATAPUMP

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html

 

PL/SQL Packages and Types Reference

The DBMS_DATAPUMP package is used to move all, or part of, a database between databases, including both data and metadata.

docs.oracle.com

 

AWS의 DBMS_DATAPUMP

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Oracle.Procedural.Importing.DataPump.html

 

Oracle Data Pump를 사용한 가져오기 - Amazon Relational Database Service

덤프 파일이 5TB를 초과하면 병렬 옵션을 사용하여 Oracle Data Pump 내보내기를 실행할 수 있습니다. 이 작업은 개별 파일에 대해 5TB 제한을 초과하지 않도록 데이터를 여러 덤프 파일로 분산합니다.

docs.aws.amazon.com