본문 바로가기

IT/AWS

[AWS] RDS for Oracle 에서 Datapump 사용 예시

728x90
반응형

RDS for Oracle 에서 Datapump 사용 예시

Datapump는 Oracle에서 제공하는 데이터 이관을 위한 유틸리티이다.

Datapump 작업은 일반적으로 데이터베이스 서버에서 수행되어왔지만 클라이언트에서도 수행이 가능하다.

 

환경 :

Source : EC2 설치형 Oracle

Target : RDS for Oracle

Source DB와 Target DB 테이블스페이스 구성 상이

Orange 클라이언트에서 수행

 

사전 확인 사항 :

Source DB와 Target DB 간 방화벽 확인

원본 인스턴스 및 대상 DB 인스턴스에 덤프 파일을 저장할 수 있는 충분한 스토리지 공간이 있는지 확인

 

수행 단계 :

1. 사용자 권한 부여

2. Source DB에서 DB link 설정

3. Source DB 디렉토리 설정

4. Source DB에서 EXPORT 작업

5. DBLink로 파일 전송

6. Target DB에서 IMPORT 작업

7. 정합성 확인 및 파일 정리

 


 

1. 사용자 권한 부여

  • Source DB 사용자 권한 부여

(+ Source DB가 rds인 경우 마스터 계정을 사용하며 별도 권한 부여 필요 없음)

CREATE USER export_user IDENTIFIED "password";
GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user;
ALTER USER export_user QUOTA 100M ON users;
GRANT SELECT_CATALOG_ROLE TO export_user;
GRANT EXECUTE ON DBMS_DATAPUMP TO export_user;
GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;

 

  • Target DB 계정 생성 및 권한 부여
CREATE USER schema_1 IDENTIFIED "password";
GRANT CREATE SESSION, RESOURCE TO schema_1;
ALTER USER schema_1 QUOTA 100M ON users;

 

 

2. Source DB에서 DB link 설정

Source DB에서 Target DB로 덤프파일을 이동하기 위해 DB link를 생성한다.

 

  • Source DB에서 DB link 생성
CREATE DATABASE LINK target_db_link 
  CONNECT TO <master_user_account> IDENTIFIED BY "<password>"
  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)
         (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';

 

  • DB link 생성 확인
select * from dba_db_links;

 

  • DB link 정상 동작 확인 - Source DB 에서 Target DB 테이블 조회가 되는지 확인
select * from target_DB_table@target_db_link;

 

 

3. Source DB 디렉토리 설정

Datapump 작업에 이용할 디렉토리와 접근 권한을 확인한다.

설치형 Oracle의 경우 서버에서 디렉토리를 생성하여 신규 디렉토리 구성이 가능하다.

RDS의 경우 사용자 디렉토리 생성이 불가능하며 기존에 DATA_PUMP_DIR 디렉토리가 구성되어있다.

 

  • 디렉토리 확인
select * from dba_directories;

 

원하는 디렉토리가 없는 경우 디렉토리를 생성한다

  • 디렉토리 생성(설치형 Oracle)
-- 서버에서 경로 생성
mkdir /oracle/datapump

-- DB에서 디렉토리 생성
create or replace directory DATA_PUMP_DIR as '/oracle/datapump';

-- 사용자에 디렉토리 READ, WRITE 권한 부여
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user;

 

4. Source DB에서 EXPORT 작업

Source DB에서 DATAPUMP를 이용하여 덤프파일을 생성한다. 

 

  • EXPORT 예시

Source DB에서 Schema1, 2, 3 에 대한 덤프파일 생성 예시

DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'EXPORT' , -- 작업 유형 : EXPORT
    job_mode  => 'SCHEMA' , -- 작업 대상 : SCHEMA
    job_name  => null
  );
  DBMS_DATAPUMP.ADD_FILE( -- 덤프파일 설정
    handle    => v_hdnl, 
    filename  => 'sourcedb01.dmp'    , -- 덤프파일 명
    directory => 'DATA_PUMP_DIR' ,  -- 덤프파일 저장 디렉토리
    filetype  => dbms_datapump.ku$_file_type_dump_file
  );
  DBMS_DATAPUMP.ADD_FILE( -- 로그파일 설정
    handle    => v_hdnl           , 
    filename  => 'sourcedb01.log' , -- 로그파일 명
    directory => 'DATA_PUMP_DIR'  ,  -- 로그파일 저장 디렉토리
    filetype  => dbms_datapump.ku$_file_type_log_file
  );
  DBMS_DATAPUMP.METADATA_FILTER( -- 이관 대상 설정
    v_hdnl              ,
    'SCHEMA_EXPR'       , -- 스키마 export
    'IN (''SCHEMA1'',''SCHEMA2'',''SCHEMA3'')' -- 스키마 지정
  );

  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/

 

  • Datapump 진행상황 확인
select * from dba_datapump_jobs;

 

 

5. DBLink로 파일 전송

  • Source DB에서 DB link로 파일 전송
BEGIN
  DBMS_FILE_TRANSFER.put_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'sourcedb01.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'sourcedb01.dmp', 
    destination_database          => 'target_db_link' );
END;
/

 

  • Target DB에서 디렉토리에 파일이 전송된 것 확인
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;

 

 

6. Target DB에서 IMPORT 작업

Target DB에서 덤프파일을 이용하여 데이터를 가져온다.

 

  • IMPORT 예시

Target DB에서 SCHEMA1, 2, 3 을 가져오고 Tablespace 를 REMAP 하는 예시

DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'IMPORT', -- 작업 유형 : IMPORT
    job_mode  => 'SCHEMA', -- 작업 대상 : SCHEMA
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE( -- 덤프 파일 설정
    handle    => v_hdnl, 
    filename  => 'sourcedb01.dmp', -- 덤프 파일 명
    directory => 'DATA_PUMP_DIR', -- 덤프 파일 디렉토리
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE( -- 로그 파일 설정
    handle    => v_hdnl, 
    filename  => 'sourcedb01.log', -- 로그 파일 명
    directory => 'DATA_PUMP_DIR', -- 로그 파일 생성 디렉토리
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA1'',''SCHEMA2'',''SCHEMA3'')'); -- 이관 대상 스키마
  DBMS_DATAPUMP.METADATA_REMAP(v_hdnl,'REMAP_TABLESPACE','SOURCE_DATA','TARGET_DAT'); -- 테이블스페이스 REMAP (복수 설정 가능)
  DBMS_DATAPUMP.METADATA_REMAP(v_hdnl,'REMAP_TABLESPACE','SOURCE_INDEX','TARGET_IDX'); -- 테이블스페이스 REMAP
  DBMS_DATAPUMP.METADATA_REMAP(v_hdnl,'REMAP_TABLESPACE','TEMP2','TEMP'); -- TEMP 테이블스페이스 REMAP
  DBMS_DATAPUMP.SET_PARAMETER(v_hdnl,'TABLE_EXISTS_ACTION','TRUNCATE'); -- 대상 테이블이 이미 존재할 경우 수행 설정
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/

 

  • Datapump 진행상황 확인
select * from dba_datapump_jobs;

 

  • IMPORT 로그 확인
select * from TABLE(
    rdsadmin.rds_file_util.read_text_file(
    p_directory => 'DATA_PUMP_DIR',
    p_filename => 'source01.log'
));

 

 

7. 정합성 확인 및 파일 정리

  • RDS에서 디렉토리의 파일 삭제
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','filename');
728x90
반응형