Oracle Data Pump와 DMS를 사용해 Oracle DB를 RDS로 마이그레이션 하기(2)

Sojeong Baek
Cloud Villains
Published in
17 min readFeb 14, 2023

Oracle Data Pump를 활용해 마이그레이션하는 방법에 이어 AWS의 DB 마이그레이션 서비스인 DMS를 활용하는 방법에 대해 알아보도록 하겠습니다.

2. DMS로 스키마 이관하기

📕시나리오

127.0.0.0/16 대역 VPC를 온프레미스 네트워크라고 가정합니다. 10.0.0.0/16 대역 VPC는 타겟 DB가 위치한 AWS 네트워크입니다. 마찬가지로 EC2를 소스 DB가 설치된 온프레미스 서버라고 가정합니다. 해당 서버 내에는 sqlplus 설치 및 샘플 데이터가 저장되어 있습니다. 온프레미스 네트워크와 AWS VPC 간 통신이 가능하도록 양 VPC 간 Site-to-Site VPN가 생성되어 있습니다. DMS를 통해 온프레미스에 위치한 소스 DB에서 AWS RDS로 데이터를 이관합니다.

  • 소스 DB: 온프레미스 서버 내 설치된 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0–64bit Production
  • SID: TEST
  • 스키마: TESTUSR(약 1GB)
  • User: scott
  • P/W: tiger
  • 타겟 DB: Oracle RDS 19c Standard Edition Two

💡실무용 추가 팁

  • 오라클 소스 DB를 DMS로 마이그레이션할 때의 제약 사항 참고 링크

1. Full Load

DB 이관에 앞서, 소스 DB가 설치된 서버에 접속하여 오라클 DB가 DMS 인스턴스와 통신할 수 있도록 리스너 설정이 필요합니다.

오라클 리스너 포트는 기본 1521 포트가 아닌 다른 포트를 지정해서 사용하기도 합니다. listener.ora 파일 내 리스너명과 리스너 포트를 추가로 명시하여 해당 리스너 포트로 기동시킬 수 있습니다.

아래 커맨드로 해당 디렉토리에 위치한 listener.ora 파일을 vi 편집기로 편집합니다.

vi oracle/product/12.1.0/network/admin/listener.ora

디폴트로 입력되어 있는 포트 1541 리스너 설정 내용 아래에 추가적으로 아래 내용을 추가합니다.

TEST2 =
(ADDRESS = (PROTOCOL = TCP)(HOST =${IDC 오라클 서버 IP})(PORT = 1521))
)
SID_LIST_TEST =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = TEST)
(ORACLE_HOME = /home/ec2-user/oracle/product/12.1.0)
(SID_NAME = TEST)
)
)

아래 커맨드로 추가한 포트 1521 리스너가 정상적으로 구동 되는 것을 확인합니다.

lsnrctl reload TEST2
lsnrctl status TEST2

DMS로 마이그레이션하기에 앞서 sysdba로 소스 DB에 접속해 유저 scott에게 아래 권한을 부여합니다.

sqlplus / as sysdba
GRANT SELECT on V_$DATABASE to scott;
GRANT SELECT on V_$THREAD to scott;
GRANT SELECT on V_$PARAMETER to scott;
GRANT SELECT on V_$NLS_PARAMETERS to scott;
GRANT SELECT on V_$TIMEZONE_NAMES to scott;
GRANT SELECT on ALL_INDEXES to scott;
GRANT SELECT on ALL_OBJECTS to scott;
GRANT SELECT on ALL_TABLES to scott;
GRANT SELECT on ALL_USERS to scott;
GRANT SELECT on ALL_CATALOG to scott;
GRANT SELECT on ALL_CONSTRAINTS to scott;
GRANT SELECT on ALL_CONS_COLUMNS to scott;
GRANT SELECT on ALL_TAB_COLS to scott;
GRANT SELECT on ALL_IND_COLUMNS to scott;
GRANT SELECT on ALL_LOG_GROUPS to scott;
GRANT SELECT on SYS.DBA_REGISTRY to scott;
GRANT SELECT on SYS.OBJ$ to scott;
GRANT SELECT on DBA_TABLESPACES to scott;
GRANT SELECT on ALL_TAB_PARTITIONS to scott;
GRANT SELECT on ALL_ENCRYPTED_COLUMNS to scott;
GRANT SELECT ANY TRANSACTION to scott;
GRANT SELECT on V_$LOGMNR_LOGS to scott;
GRANT SELECT on V_$LOGMNR_CONTENTS to scott;
GRANT SELECT on V_$LOG to scott;
GRANT SELECT on V_$ARCHIVED_LOG to scott;
GRANT SELECT on V_$LOGFILE to scott;
GRANT SELECT on V_$TRANSACTION to scott;
GRANT SELECT on V_$DATABASE to scott;

소스 DB 측에서의 사전 준비는 완료되었습니다. 이제 AWS 측에서 필요한 준비를 할 차례입니다.

DMS로 마이그레이션하기 위해서는 DMS Replication instance가 위치할 Subnet group, 소스 DB 및 타겟 DB과 연결될 Endpoint, 복제를 진행할 Replication instance가 필요합니다. 위 세 가지가 생성이 되면 Database migration task를 생성하여 마이그레이션을 시작합니다.

DMS 페이지 내 Subnet groups 탭에서 서브넷을 생성합니다. 해당 서브넷은 Replication instance 가 위치할 서브넷입니다. 타겟 DB가 위치한 VPC 선택 및 프라이빗 서브넷을 선택합니다. 이렇게 생성을 하게 되면 Replication instance가 타겟 DB쪽의 네트워크에 위치하게 됩니다.

소스 DB에서 백업 파일 생성 후 Replication instance에 FTP로 백업 파일을 전송하고 Replication instance에서 타겟 DB로 파일을 보내게 되는데, 해당 인스턴스와 타겟 DB가 같은 AWS 네트워크 내에 있으므로 AWS 전용망인 백본을 통해 더 빠른 속도로 이관 가능합니다.

DMS Replication instance 생성에 앞서 EC2 페이지 내 security group 탭에서 DMS Replication instance에 적용할 security group을 생성합니다. 타겟 DB가 위치한 AWS VPC 선택 후 별도의 룰은 설정할 필요가 없습니다.

DMS Replication instance 보안그룹 생성 후에 소스 DB 및 타겟 DB의 보안그룹 모두에 DMS 복제 인스턴스 보안그룹에 대한 인바운드 룰을 허용합니다.

DMS 페이지로 돌아가 Replication instances 탭에서 복제를 진행할 인스턴스를 생성합니다. Replication instance configuration에서는 적절한 인스턴스 타입과 Multi-AZ 여부를 선택합니다. 테스트용이므로 인스턴스 타입은 dms.t3.small로 지정합니다.

Replication instance 스토리지에는 진행 중인 이관 작업 로그 및 캐시된 변경 사항을 저장합니다. 추후 task를 생성할 때 이관 프로세스 로그 수집을 위해 CloudWatch logs를 활성화하고자 하면 스토리지를 크게 설정해야 합니다.

Advanced security and network configuration에서 방금 생성한 Replication subnet group 및 VPC security group을 선택합니다.

인스턴스 생성이 완료되면 소스 DB 및 타겟 DB과 연결될 Endpoint를 생성합니다.

Endpoints 탭에서 Source endpoint를 생성합니다.

Endpoint configuration에서 소스 DB 정보를 입력합니다. Server name에는 온프레미스 DB 서버의 프라이빗 IP를 입력하고 User name 및 Password에는 소스 DB 유저명 및 패스워드를 입력합니다.

Source endpoint 생성이 완료되면 Connections 탭에서 Replication instance와 Source endpoint가 잘 연결되었는지 테스트를 합니다.

Source endpoint 생성을 마친 후, Target endpoint를 생성합니다. Target endpoint가 연결될 타겟 DB가 RDS이므로

‘Select RDS DB Instance’에 체크하여 내 계정 내 RDS를 선택합니다.

Endpoint configuration에서 타겟 RDS 정보를 입력합니다. Server name에는 RDS endpoint를 입력하고 User name 및 Password에는 소스 DB 유저명 및 패스워드를 입력합니다.

생성 후 Connections 탭에서 테스트 해보면, 타겟 DB와 endpoint가 잘 연결된 것을 확인 할 수 있습니다. Target의 경우, Source endpoint에 비해서는 비교적 연결이 원활하게 가능합니다.

위와 같이 DMS가 위치할 Subnet group, 소스 DB 및 타겟 DB와 연결 될 Endpoint, 복제를 진행 할 Replication instance 생성을 완료했습니다. 이제 Database migration task를 생성하여 마이그레이션을 시작하겠습니다.

Database migration tasks 탭에서 task를 생성합니다. 기존에 생성해둔 인스턴스 및 엔드포인트들을 선택합니다.

1. Do nothing은 기존 테이블의 데이터와 메타데이터는 변경하지 않고 기존대로 유지합니다 . 기존에 테이블 내 데이터가 있다면 다시 이관을 진행할 때 데이터가 중복될 수 있으니 확인이 필요합니다.

Drop tables on target은 기존 테이블을 drop 시키고 새로운 테이블을 만들어 해당 테이블에 데이터를 이관시킵니다. Truncate는 테이블 메타데이터는 유지하고 테이블 내 데이터를 truncate합니다. 해당 옵션은 타겟 테이블 스키마 변경 없이 새로운 데이터를 로딩할 때 사용합니다.

위 모든 옵션들은 타겟 테이블이 없으면 테이블을 생성합니다.

2. LOB이란 ‘Large of object’의 약자로 CLOB, BLOB이라고 해서 이미지나 비디오, 대용량 텍스트 등 대형 데이터를 저장하는 데 사용되는 자료형입니다. 위 옵션에서 Full LOB mode는 모든 LOB컬럼에 대해 이관을 하므로 이관 시간이 지연될 수 있습니다.

LOB이 포함되는 컬럼이 있다면, Limited LOB mode를 선택하고 컬럼의 최대 사이즈를 제한하는 것이 좋습니다. 실제 데이터가 Max LOB size를 초과하면 초과한 데이터는 truncate 되기 때문에 Max LOB size를 실제 데이터 사이즈에 맞게 지정하는 것이 중요합니다. 특정 테이블에 LOB 컬럼이 많이 있다면 특정 테이블 별로 task를 생성하는 방법도 있습니다.

3. Validation 옵션을 활성화하면 소스 DB에서 타겟으로 정확히 이관이 되었는지 확인하기 위해 데이터를 검증합니다. SOX*또는 보안 준수를 위해 Data validation을 필수로 활성화 합니다.

*SOX: 상장 기업의 재무 보고와 감사 활동을 규제하는 법

4. Amazon CloudWatch logs를 활성화하면 CloudWatch를 통해 DMS 태스크의 진행 상황, 사용한 리소스 및 사용한 네트워크 활동을 모니터링할 수 있습니다. 로깅을 위해서는 더 큰 Replication instance 메모리가 필요할 수 있습니다.

Table mappings에서 Add new selection rule을 선택해 이관할 소스 DB의 스키마와 테이블을 입력합니다. ‘%’는 와일드 카드로 모든 테이블을 선택합니다.

실무에서 이관을 진행할 때는 Premigration assessment를 활성화하여 데이터 타입 변환 문제를 사전에 확인합니다. 테스트 시에는 체크하지 않고 task를 생성합니다.

Task가 실행되는 동안 Table statistics 탭에서 진행 상황을 확인할 수 있습니다.

CloutWatch metrics 탭에서 각종 지표를 확인할 수 있습니다.

CloudWatch 페이지 — Log groups에도 Replication instance 이름으로 로그 그룹이 생성된 것을 확인할 수 있습니다.

해당 로그 그룹 내 Log streams에서 더 자세한 로그들을 확인할 수 있습니다.

Load가 완료됐다고 나오면 DB에 접속해 아래 커맨드로 데이터가 이관된 것을 확인하기 위해 ITEM 테이블 내 레코드 개수를 count하여 모든 레코드가 잘 이관되었는지 확인합니다.

또한 아래 커맨드로 레코드 20개를 select하여 데이터가 잘 들어왔는지도 확인합니다.

SELECT COUNT(*) FROM ITEM;
SELECT * FROM ITEM WHERE rownum >=1 AND rownum <= 20;

2. CDC

Full load가 끝났다면 이관 이후 변경된 데이터에 대해서도 이관이 필요합니다. 변경된 데이터를 타겟 DB에 반영하는 것을 CDC(Change Data Capture)라고 합니다.

CDC를 진행하기 위해서는 소스 DB의 유저 scott에 아래 권한을 추가해야 합니다.

sqlplus / as sysdba
GRANT EXECUTE ON dbms_logmnr TO scott;
GRANT LOGMINING TO scott;
GRANT SELECT ON v_$transportable_platform to scott;
GRANT CREATE ANY DIRECTORY to scott;

오라클에서는 DB 내 특정 시점에 발생한 변경사항에 대해 SCN(System change numer)로 관리합니다. SCN은 DB 내 트랜잭션이 commit되면 부여되는 번호입니다. 특정 트랜잭션이 commit 되기 전의 SCN으로 CDC 이관을 해보겠습니다.

아래 커맨드로 DB 내 특정 업데이트 전의 SCN을 확인하고 ITEM 테이블 내 레코드 20개를 삭제합니다.

ALTER SESSION SET CURRENT_SCHEMA = TESTUSR;
SELECT COUNT(*) FROM ITEM;
SELECT CURRENT_SCN FROM v$database;
DELETE FROM ITEM WHERE ROWNUM >=1 AND ROWNUM <= 20;
COMMIT;

추후 DMS Task 생성 시에 SCN가 필요하니 기록 해 둡니다.

오라클 DB 소스로 CDC 작업 시 redo log를 읽는 모드로는 LogMiner와 Binary Reader 두 가지가 있습니다. 오라클 LogMiner는 redo log를 읽는 오라클 API이고 Binary Reader은 redo log를 읽고 바로 파싱하는 DMS 메소드입니다. 일반적으로 성능 또는 소스 DB쪽의 부하를 고려하여 Binary 모드를 권장합니다. 각 모드에 대한 상세한 차이는 링크에서 확인할 수 있습니다.

Binary Reader를 사용하기 위해서는 source endpoint의 extra connection attribute를 수정 해 주어야 합니다. 소스 엔드포인트를 선택 후 수정을 누릅니다.

Endpoint setting 탭에서 Use endpoint connection attribute를 체크하고 아래 설정 내용을 추가합니다.

useLogMinerReader=N;useBfile=Y;

Endpoint setting 탭 해당 설정이 반영된 것을 확인할 수 있습니다.

DMS 페이지 — Database migration tasks 탭에서 task를 생성합니다. 생성한 Replication instance, Source endpoint 및 Target endpoint를 선택합니다. CDC를 위한 task 생성 시에는 Migration type을 Replicate data changes only로 선택합니다.

CDC start mode를 제외한 다른 Task settings 옵션들을 default로 선택합니다. CDC start mode는 Specify a log sequence number를 선택 후 소스 DB에서 ITEM 테이블을 업데이트하기 전 조회한 SCN을 입력합니다.

Table mappings에서는 스키마 이름을 입력 후 Table은 와일드카드로 모든 table을 선택합니다.

맨 아래 create task를 눌러 task를 생성합니다.

Task가 생성되고 Replication이 시작됩니다.

DMS Task 페이지 내 Table statistics에서 확인해보면 ITEM 테이블 내 레코드 20개가 DELETE된 것을 나타내줍니다.

이렇게 DMS로 CDC까지 완료하였습니다.🙌

지금까지 2편에 걸쳐Oracle DB를 AWS RDS로 이관하는 두 가지 방법에 대해서 알아보았습니다.

DMS를 활용하면 간편한 설정을 통해 최소한의 다운 타임으로 DB를 이관할 수 있는 점이 가장 큰 장점입니다. Oracle Data Pump는 높은 수준의 병렬 및 다양한 데이터 추출 옵션을 활용할 수 있습니다.

마이그레이션 상황과 니즈에 맞게 적절한 방법을 채택하여, 해당 글을 참고해 마이그레이션을 진행하시면 좋을 것 같습니다.

--

--

Sojeong Baek
Cloud Villains

A junior solutions architect loves tech and business.