기존 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
AWS의 DBMS_DATAPUMP
'AWS(Amazon Web Service)' 카테고리의 다른 글
CloudWatch Alarm을 Slack 연동하기 (2) | 2024.04.15 |
---|---|
AWS 인스턴스 스케줄러 KMS 권한 설정 방법 (0) | 2024.04.12 |
불완전한 멀티파트 업로드 삭제 (0) | 2024.04.12 |
AWS DMS를 이용해서 Oracle to PostgreSQL 데이터 전송 (0) | 2024.04.12 |