본문 바로가기

Database/Oracle

Oracle Database Migration to aws RDS using DB-LINK

Oracle Database Migration to aws RDS using DB-LINK에 대해 설명합니다.

On-Premise Oracle Database를 AWS로 Migration 하는 방법 중에서 DB-LINK를 이용하는 방법입니다.

S3 버킷을 이용하지 않고 직접 RDS로 이관하므로 시간을 단축할 수 있습니다.

 

덤프파일을 S3에 거치지 않는 대신 이외 Export, 전송, Import과정은 모두 포함합니다. 또한 RDS의 DATA_PUMP_DIR 공간을 사용하기 때문에 RDS의 용량을 많이 사용할 수 있습니다.

덤프파일의 공간과 Import시 생성되는 공간이 모두 필요합니다. RDS스토리지는 축소되지 않기 때문에 용량이 많을 경우 작업을 나눠서 작은 파일로 여러 번 작업해야 할 수도 있습니다.

 

또한 실시간 데이터 이관을 하거나 작업시간이 부족하거나 용량이 절대적으로 부족한 경우 DMS(Database Migration Service)를 이용할 수도 있습니다. DMS에 대해서는 별도로 다루고 있습니다. 여기에서는 Dump파일을 이용하는 방법으로 알아보겠습니다.

 

수행 단계

STEP 1. 소스 오라클 데이터베이스에 연결

STEP 2. DBMS_DATAPUMP로 Export

STEP 3. DB-LINK 와 DBMS_FILE_TRANSFER.PUT_FILE로 덤프파일 복사(DATA_PUMP_DIR로 복사)

STEP 4. DBMS_DATAPUMP로 Import

 

사전 필요 요건

각 단계에 필요한 실행 권한 필요 부여

  • DBMS_FILE_TRANSFER 및 DBMS_DATAPUMP 실행 권한 부여
  • 원본 덤프 디렉토리 쓰기 권한 부여
  • 원본 및 대상 DB 덤프 저장 공간 확보

 

대상 DB 테이블스페이스 및 사용자 생성

대상 DB에 테이블 스페이스 및 사용자를 생성합니다. 테이블 스페이스 용량을 조절하여 생성하고, 사용자 및 암호를 설정합니다. 접속할 수 있도록 권한을 부여합니다.

-- 테이블스페이스 생성
create tablespace TS_USER01_D datafile size 1G autoextend on;

-- 사용자 생성
-- drop user USER01 cascade;
create user USER01 identified by "USER01PassW0rd" default tablespace TS_USER01_D temporary tablespace temp quota unlimited on TS_USER01_D;
grant create session, resource to USER01;

소스 DB 권한 확인

일반적으로 SYSTEM, SYS 계정을 사용하면 별도 권한 필요 없습니다.

DBMS_DATAPUMP를 사용하여 Export

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'USER01_20240101.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'USER01_20240101.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER01'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

DB-LINK 생성

CREATE DATABASE LINK to_RDSDB
  CONNECT TO dbadmin 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로 파일 전송

  DBMS_FILE_TRANSFER.PUT_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'USER01_20240101.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'USER01_20240101_copied.dmp', 
    destination_database          => 'to_RDSDB' );
END;
/

DBMS_DATAPUMP로 Import

미리 생성된 테이블 스페이스와 계정을 확인하고, 해당 계정에 대해 Import를 수행합니다. 테이블스페이스가 변경되어 remap 옵션을 사용하여 수행합니다.

DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'USER01_20240101.DMP', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'USER01_20240101.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER01'')');
DBMS_DATAPUMP.METADATA_REMAP(hdnl,'REMAP_TABLESPACE','TS_IBE_DATA','TS_USER01_D');
DBMS_DATAPUMP.METADATA_REMAP(hdnl,'REMAP_TABLESPACE','TS_IBE_INDX','TS_USER01_D');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/

파일 삭제

불필요한 파일을 확인하고, 삭제합니다. dmp파일과 log파일을 삭제합니다.

SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;

EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp');

 

이상 DB-LINK를 이용해서 AWS로 마이그레이션 하는 방법을 마치겠습니다.