많은 기업들이 온프레미스 Oracle Database를 AWS로 마이그레이션하고 있습니다. 이러한 마이그레이션의 주요 동기는 MySQL과 같은 오픈소스 데이터베이스 엔진으로 이동하여 라이선스 비용을 절감하고, 클라우드 네이티브 아키텍처로 현대화하며, 마이크로서비스 아키텍처를 통해 더 유연한 데이터 활용을 가능하게 하는 것입니다. 이 경우, AWS는 Oracle에서 Amazon Aurora MySQL 또는 Amazon Relational Database Service(Amazon RDS) for MySQL로 마이그레이션하기 위해 AWS Database Migration Service(AWS DMS)를 사용할 것을 권장합니다. 이는 AWS DMS가 다양한 이기종 DB 환경을 지원하고 표준화된 마이그레이션 프로세스를 제공하기 때문입니다.
그러나 AWS DMS는 소스 및 타겟 데이터베이스의 고유한 특성으로 인해 모든 특수 사례를 지원하지 못할 수 있습니다. 이러한 제한 사항으로 인해 AWS DMS를 마이그레이션 선택으로 사용할 수 없는 경우, 데이터를 수동으로 내보내고 가져와야 하는 번거로움이 발생할 수 있습니다.
이 글에서는 AWS DMS를 사용할 수 없을 때 Oracle Database Gateways를 통해 Oracle Database를 마이그레이션하는 방법을 설명합니다. Oracle Database Gateways를 사용하면 MySQL 데이터베이스를 Oracle Database의 데이터베이스 링크로 등록할 수 있습니다. 간단한 방법은 소스 Oracle Database에 Gateway를 설치하고 AWS의 MySQL Database에 원격으로 연결하여 데이터를 읽고 삽입하는 것입니다. 또한, AWS 환경에서 별도의 Gateway를 구성하여 온프레미스 Oracle Database와 AWS의 MySQL Database 간에 데이터베이스 링크를 생성하고, 데이터를 원격으로 읽고 로드하는 방법도 설명합니다. 이 접근법은 서로 다른 환경의 Oracle 데이터베이스에 대해 일관된 마이그레이션을 제공하며, 소스 및 타겟 데이터베이스의 구성을 변경하지 않고 안전하게 설정할 수 있습니다.
AWS DMS의 장점과 제한사항
Oracle Database에서 Aurora MySQL 호환 또는 Amazon RDS for MySQL로의 마이그레이션은 여러 가지 방법으로 가능합니다. 가장 일반적인 방법은 AWS DMS를 사용하는 것입니다. AWS DMS는 온프레미스의 소스 데이터베이스와 AWS 클라우드의 타겟 데이터베이스 간의 데이터 복제를 지원하는 관리형 서비스입니다. AWS DMS를 사용한 마이그레이션의 주요 장점은 다음과 같습니다.
- 지속적인 데이터 복제를 통한 마이그레이션 중 다운타임 최소화
- 다양한 소스 및 타겟 데이터베이스 엔진 지원
- AWS 관리 기능으로 운영 및 관리 부담 감소
현재 AWS DMS는 Oracle Database를 소스 데이터베이스로 사용할 때 몇 가지 제약 사항이 있어 특정 시나리오에서 사용하기 어렵습니다.
- AWS DMS는 긴 객체 이름(30바이트 이상)을 지원하지 않습니다.
- AWS DMS는 멀티테넌트 컨테이너 루트 데이터베이스(CDB$ROOT)를 지원하지 않습니다.
- AWS DMS는 virtual column을 지원하지 않습니다.
- AWS DMS는 글로벌 임시 테이블을 복제 지원하지 않습니다.
이러한 제약으로 인해 AWS DMS를 사용할 수 없는 경우, 수동 데이터베이스 내보내기/가져오기 또는 백업/복원 프로세스를 통해 마이그레이션할 수 있습니다. 이는 시간이 많이 걸리고 복잡할 수 있습니다. 이 글에서는 Oracle Database Gateways를 통해 데이터베이스 링크를 생성하여 마이그레이션을 간소화하는 솔루션을 제공합니다.
솔루션 개요
이 솔루션은 Oracle Database Gateways를 통해 온프레미스 Oracle 데이터를 Aurora MySQL 호환 또는 Amazon RDS for MySQL로 원활하게 마이그레이션하는 방법을 설명합니다. 온프레미스 데이터베이스 아키텍처의 변경을 최소화하기 위해, AWS 클라우드의 Amazon EC2에 Oracle Database Gateways를 구성하여 표준화된 마이그레이션을 제공합니다.

이 솔루션에서 사용되는 주요 구성 요소는 다음과 같습니다.
- Oracle Database Gateways – Oracle Database가 이기종 데이터베이스 간에 Oracle 데이터베이스 링크를 구성할 수 있게 해줍니다.
- ODBC on Linux/Unix – 표준화된 ODBC 연결을 통해 다양한 데이터베이스 소스에 액세스할 수 있습니다. Oracle Database Gateway는 ODBC 연결을 지원하므로, 다른 이기종 데이터베이스에 대한 직접적인 ODBC 지원이 없더라도 연결이 가능합니다.
- Oracle database link – 원격 데이터베이스에 쿼리하거나 데이터를 쓰는 데 도움이 됩니다.
- Oracle PL/SQL – Oracle Database 엔진에서 사용되는 절차적 언어로, PL/SQL은 단일 SQL로 처리할 수 없는 데이터를 다양한 로직을 통해 빠르게 처리합니다.
- Amazon Aurora for MySQL 또는 Amazon RDS for MySQL – 온프레미스 Oracle 데이터의 최종 마이그레이션 대상입니다. Amazon Aurora for MySQL을 활용하면 MySQL에 대한 유지 관리가 AWS에서 수행되어 관리 노력을 크게 절감할 수 있습니다. 이는 AWS에서 MySQL을 구성하기 위한 권장 아키텍처입니다.
AWS CloudFormation을 통해 시뮬레이션된 환경을 구축하여 이 솔루션을 테스트했습니다. 다음 다이어그램은 온프레미스 환경을 시뮬레이션하기 위한 별도의 가상 프라이빗 클라우드(VPC)로 구성된 아키텍처를 보여줍니다.

아키텍처에는 다음 요소가 포함됩니다.
- On-premises VPC – 이 VPC는 온프레미스 데이터 센터를 시뮬레이션합니다.
- Source Oracle Database – 이 데이터베이스는 온프레미스 Oracle 데이터베이스를 시뮬레이션합니다. 구성의 용이성을 위해 이 환경은 Amazon RDS for Oracle을 사용하여 구성됩니다.
- Cloud VPC – 이는 온프레미스 데이터베이스가 마이그레이션되는 AWS 클라우드의 타겟 VPC입니다.
- Oracle Database Gateways – AWS 클라우드 VPC의 Amazon EC2에 구성됩니다. 다양한 운영 체제(OS) 구성이 필요하기 때문에 Amazon EC2에 설치 유형으로 구성했습니다.
- Aurora MySQL Database – 이 데이터베이스는 온프레미스 Oracle이 최종적으로 마이그레이션될 타겟 데이터베이스를 시뮬레이션합니다. 이 글에서는 Aurora MySQL 호환을 사용하지만, Amazon RDS for MySQL로도 구성할 수 있습니다.
- VPC peering – 네트워크 통신을 가능하게 하기 위해 온프레미스 VPC와 AWS 클라우드 VPC 간의 원활한 통신을 위해 VPC 피어링을 사용합니다.
Prerequisites
AWS CloudFormation으로 이 솔루션을 구성하려면 다음을 준비해야 합니다.
- Oracle Linux 7 – Oracle Linux는 GNU General Public License(GPLv2)에 따라 사용 가능한 오픈 소스 OS입니다. 이미지는 Amazon EC2 콘솔에서 검색하고 구성하거나, AWS Marketplace에서 구독으로 사용할 수 있습니다.
- Oracle Database installation file – Oracle 웹사이트를 방문하여 Oracle 설치 파일을 다운로드할 수 있습니다.
- Oracle Database license – Oracle Database Gateways는 Oracle Database Enterprise Edition 라이선스에 포함되어 있습니다.
- MySQL ODBC connector – MySQL ODBC 커넥터는 MySQL 웹사이트에서 다운로드할 수 있습니다. Oracle 웹 계정이 있는 경우, Oracle 웹 계정으로 MySQL 웹사이트에 로그인하여 커넥터를 다운로드할 수 있습니다.
- AWS account – AWS 계정이 필요합니다.
- Oracle web account – Oracle에서 제공하는 패키지를 다운로드하려면 Oracle 웹에 액세스할 수 있는 계정이 필요합니다. 필요한 경우 무료 계정에 가입할 수 있습니다.
이 솔루션은 Amazon EC2 및 Amazon RDS 리소스 생성과 네트워크 전송 비용에 대한 비용이 발생합니다. 그러나 Oracle 클라이언트를 생성하기 위해 Amazon EC2의 무료 티어를 사용할 수 있습니다. 비용 추정을 위해 AWS Pricing calculator를 사용할 수 있습니다.
AWS CloudFormation으로 환경 구성
앞서 설명한 시뮬레이션된 환경을 사용하려면 이 글에서 제공하는 CloudFormation 템플릿을 사용하세요. 템플릿은 Oracle Linux 7(또는 Oracle Linux 8)의 AMI ID를 입력 매개변수로 사용합니다. 이 AMI ID를 얻으려면 Amazon EC2 콘솔에서 사용 가능한 Oracle Linux 7(또는 Oracle Linux 8)을 검색하거나, AWS Marketplace에서 Oracle Linux 7(또는 Oracle Linux 8)을 구독하여 AMI ID를 얻을 수 있습니다.
Amazon EC2 콘솔을 통해 Oracle Linux 7(또는 Oracle Linux 8)의 AMI ID를 찾으려면, Amazon EC2 콘솔로 이동하여 ‘Launch instance’을 선택합니다.

“OL7” 또는 “OL8” 키워드로 AMI를 검색합니다.

이렇게 하면 다음 스크린샷과 같이 사용 가능한 AMI거 검색됩니다. 사용할 수 있는 AMI를 확인하고, 이 AMI ID를 복사하여 나중에 사용합니다.

이제 AMI ID가 있으므로, Launch Stack을 선택하여 CloudFormation 리소스를 배포합니다.

다음 매개변수를 입력합니다.
- MasterUserPassword에는 데이터베이스의 기본 사용자의 비밀번호를 입력합니다.
- OracleLinuxAmiId에는 앞서 수집한 AMI ID 값을 입력합니다.

확인 체크박스를 선택하고 Create stack을 선택합니다.

CloudFormation이 완료되는 데 약 30분이 소요됩니다. CloudFormation 스택이 완료되면 다음 단계로 진행합니다.
Oracle Database Gateways 설치
기본 구성으로 Oracle을 설치하면 Oracle Database Gateways도 엔진 내에 포함되어 설치됩니다. Oracle Database 설치 절차는 Oracle Database 설치를 위한 RPM 패키지 실행에 설명되어 있습니다. 지원되는 운영 체제 목록은 소프트웨어 요구 사항을 참조하세요. 다음 OS 버전이 지원됩니다.

Oracle Database Gateways를 설치하려면 먼저 공식 Oracle 사이트에서 Oracle 설치 파일을 다운로드해야 합니다. 이를 위해 Oracle 소프트웨어 다운로드 페이지로 이동하여 설치 파일을 다운로드합니다.
다운로드한 이미지를 준비했으면 다음 단계에 따라 Oracle Database Gateway를 설치할 수 있습니다.
1. Amazon EC2 콘솔에서 OraServer로 시작하는 EC2 인스턴스(AWS CloudFormation에 의해 생성됨)를 선택하고 Connect을 선택합니다.

2. 연결 사용자 이름으로 ec2-user를 입력하고 Connect을 선택합니다.

그러면 ec2-user로 Amazon EC2에 연결됩니다.
3. 다음 명령을 사용하여 루트 사용자로 로그인합니다.
4. wget을 사용하여 Oracle 데이터베이스 사전 설치 패키지를 다운로드하고 설치합니다.
Oracle Linux 7의 경우, 다음 명령을 실행합니다.
wget https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
Oracle Linux 8의 경우, 다음 명령을 실행합니다.
wget https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm
yum -y localinstall oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm
1. 사전 다운로드한 Oracle 설치 파일을 이용해서 Oracle을 설치하려면 다음 명령을 실행합니다. 약 5분 정도 소요될 수 있습니다.
yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm
2. Oracle Database 엔진 설치가 완료된 후, 다음 명령으로 데이터베이스를 구성합니다. 약 20분 정도 소요될 수 있습니다.
/etc/init.d/oracledb_ORCLCDB-19c configure
3. 다음 명령을 실행하여 Oracle 사용자의 환경 정보를 구성합니다.
cat << 'EOF' >> /home/oracle/.bash_profile
# User specific environment and startup program
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_VERSION=19c
export ORACLE_SID=ORCLCDB
export TEMPLATE_NAME=General_Purpose.dbc
export CHARSET=AL32UTF8
export PDB_NAME=ORCLPDB1
export LISTENER_NAME=LISTENER
export NUMBER_OF_PDBS=1
export CREATE_AS_CDB=true
# General exports and vars
export PATH=$ORACLE_HOME/bin:$PATH
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
DBCA=$ORACLE_HOME/bin/dbca
NETCA=$ORACLE_HOME/bin/netca
ORACLE_OWNER=oracle
RETVAL=0
CONFIG_NAME=oracledb_$ORACLE_SID-$ORACLE_VERSION.conf
CONFIGURATION=/etc/sysconfig/$CONFIG_NAME
set -o vi
EOF
UnixODBC 및 MySQL 커넥터 설치
이 글에서는 Oracle Database Gateways에서 MySQL에 연결하는 방법에 대해 설명합니다. Oracle Database Gateways는 ODBC 지원을 통해 MySQL에 연결할 수 있습니다. Linux 환경에서 사용 가능한 ODBC 패키지는 UnixODBC 패키지입니다. UnixODBC 패키지를 설치하려면 다음 명령을 사용합니다.
UnixODBC에서 MySQL에 연결하려면 MySQL 커넥터가 필요합니다. 커넥터는 MySQL Community Downloads 웹사이트에서 다운로드할 수 있습니다.
Oracle Linux 7(또는 Oracle Linux 8)에 사용 가능한 다음 그림에 표시된 세 가지 패키지를 다운로드합니다. 다운로드하려면 Oracle 웹 계정으로 로그인해야 합니다.

마찬가지로, Oracle Linux 8을 사용하는 경우, 적절한 바이너리를 다운로드하기 위해 다음 그림을 참조할 수 있습니다.

Oracle Linux 7을 사용하는 경우, 다운로드한 패키지를 사용하여 다음 명령으로 설치합니다.
yum -y localinstall mysql-connector-odbc-9.0.0-1.el7.x86_64.rpm
yum -y localinstall mysql-connector-odbc-debuginfo-9.0.0-1.el7.x86_64.rpm
yum -y localinstall mysql-connector-odbc-setup-9.0.0-1.el7.x86_64.rpm
마찬가지로, Oracle Linux 8을 사용하는 경우, 다음 명령을 사용하여 설치할 수 있습니다.
yum -y localinstall mysql-connector-odbc-9.4.0-1.el8.x86_64.rpm
yum -y localinstall mysql-connector-odbc-debuginfo-9.4.0-1.el8.x86_64.rpm
yum -y localinstall mysql-connector-odbc-setup-9.4.0-1.el8.x86_64.rpm
yum -y localinstall mysql-connector-odbc-setup-debuginfo-9.4.0-1.el8.x86_64.rpm
ODBC 구성은 odbc.ini 파일을 통해 수행됩니다. 구성을 용이하게 하기 위해 oracle OS 사용자로부터 구성하려고 합니다. 이를 위해 oracle 사용자가 /etc/odbc.ini
파일을 수정할 수 있어야 합니다. 루트로 로그인하고 다음 명령을 실행합니다.
sudo -i
touch /etc/odbc.ini
chown oracle:oinstall /etc/odbc.ini
Oracle Database Gateways 구성을 위한 주요 환경 변수 설정
다음으로, Oracle Database를 사용할 수 있는 oracle 사용자로 Oracle Database Gateways를 구성합니다. 다음 명령을 사용하여 oracle 사용자로 로그인합니다.
oracle 사용자로 로그인한 후, 다음 명령을 사용하여 aws cli 명령이 작동하는지 확인해야 합니다.
다음은 예상되는 출력입니다.
$ aws --version
aws-cli/2.22.32 Python/3.12.6 Linux/5.15.0-101.103.2.1.el8uek.x86_64 exe/x86_64.oracle.8
이 명령이 작동하지 않는 경우, sudo su - oracle
명령을 사용하여 oracle 사용자로 로그인했는지 확인해야 합니다. 이 명령은 기본 OS 환경 설정을 상속합니다.
편리한 테스트 경험을 위해 OS 환경 변수를 사용할 것입니다. 실행한 CloudFormation 스택의 출력에는 다양한 환경 정보가 포함되어 있습니다. 다음 AWS Command Line Interface(AWS CLI) 명령을 사용하여 주요 CloudFormation 스택 출력 정보를 적절한 OS 환경 변수로 설정합니다. CLOUDFORMATION_STACK_NAME에는 프로비저닝할 때 사용한 CloudFormation 스택 이름을 사용합니다. MASTER_USER_PASSWORD에는 CloudFormation 스택을 시작할 때 입력한 비밀번호를 사용합니다.
export CLOUDFORMATION_STACK_NAME=<CloudFormationStackName>
export MASTER_USER_PASSWORD=<MasterUserPassword>
export SOURCE_ORACLE_URL=$(aws cloudformation describe-stacks --stack-name $CLOUDFORMATION_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`CF410RdsDbInstanceDns`].OutputValue' --output text)
export TARGET_AURORA_MYSQL_URL=$(aws cloudformation describe-stacks --stack-name $CLOUDFORMATION_STACK_NAME --query 'Stacks[0].Outputs[?OutputKey==`CF510RdsClusterEndpointAddress`].OutputValue' --output text)
다음 명령을 사용하여 값이 올바르게 설정했는지 확인합니다.
echo $CLOUDFORMATION_STACK_NAME
echo $MASTER_USER_PASSWORD
echo $SOURCE_ORACLE_URL
echo $TARGET_AURORA_MYSQL_URL
타겟 MySQL 서버 설정
AWS CloudFormation을 통해 Aurora MySQL 호환을 구성했습니다. Oracle Database Gateways 서버에서 다음 명령을 실행하여 MySQL 서버에 대한 연결이 성공적인지 테스트합니다.
mysql -u admin -h $TARGET_AURORA_MYSQL_URL -p$MASTER_USER_PASSWORD
MySQL에 연결한 후, 향후 테스트에 사용할 간단한 테스트 데이터를 생성합니다.
use testdb
create table employee (empno int, ename varchar(20), job varchar(20));
insert into employee values (1,'King','President'),(2,'Blake','Manager'),(3,'Scott','Analyst');
commit;
select * from employee;
select user();
select database();
ODBC 구성
이제 ODBC를 구성하는 데 필요한 모든 패키지를 설치했으므로 다음 단계를 완료합니다.
1. 다음 명령을 실행하여 지원되는 목록을 확인합니다.
2. oracle 사용자로 연결된 상태에서 다음 명령을 실행하여 드라이버 이름을 포함한 ODBC 설정을 설정합니다.
cat << EOF > /etc/odbc.ini
[TESTDB]
Driver = MySQL ODBC 9.4 Unicode Driver
Trace = no
Server = $TARGET_AURORA_MYSQL_URL
Port = 3306
Database = testdb
User = admin
Password = $MASTER_USER_PASSWORD
EOF
3. 이 설정이 작동하는지 확인하려면 다음 명령을 실행합니다.
4. isql 프롬프트에서 다음 쿼리를 실행합니다.
select * from employee;
quit
다음 예제와 같이 예상 결과를 확인합니다.
[root@ip-10-1-11-63 ~]# isql -v TESTDB
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from employee;
+-----------+-----------+-----------+
| empno | ename | job |
+-----------+-----------+-----------+
| 1 | King | President |
| 2 | Blake | Manager |
| 3 | Scott | Analyst |
+-----------+-----------+-----------+
SQLRowCount returns 3
3 rows fetched
SQL> quit
[root@ip-10-1-11-63 ~]#
.ora 파일을 사용하여 Oracle Database Gateways 설정
이전 단계에서 ODBC 설정이 작동하는지 확인했습니다. 이제 Oracle Database Gateways를 설정해 보겠습니다.
1. 먼저 listener.ora 파일을 설정합니다. 다음 명령을 사용하여 기존 listener.ora 파일에 추가 설정을 추가할 수 있습니다.
cat << EOF >> /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST=
(SID_DESC=
(SID_NAME=TESTDB)
(ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)
(PROGRAM=/opt/oracle/product/19c/dbhome_1/bin/dg4odbc)
(ENVS= "LD_LIBRARY_PATH = /usr/lib:/usr/lib64:/opt/oracle/product/19c/dbhome_1/lib:/opt/oracle/product/19c/dbhome_1/hs/lib")
)
)
EOF
2. 다음 명령을 사용하여 리스너를 재시작합니다.
lsnrctl stop
lsnrctl start
lsnrctl status
3. 다음 명령으로 tnsnames.ora에 추가 설정을 합니다.
cat << EOF >> /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora
TESTDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SID = TESTDB)
)
(HS = OK)
)
EOF
Oracle Database Gateways는 Oracle의 Heterogeneous Services를 통해 구성됩니다. Heterogeneous Services의 구성 파일은 $ORACLE_HOME/hs/admin/ 폴더를 사용하여 관리됩니다.
1. 다음 명령을 사용하여 $ORACLE_HOME/hs/admin/ 폴더에 관련 init.ora 파일을 구성합니다.
cat << 'EOF' > $ORACLE_HOME/hs/admin/initTESTDB.ora
HS_FDS_CONNECT_INFO = TESTDB
HS_FDS_TRACE_LEVEL = 255
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P15
HS_FDS_SHAREABLE_NAME = /usr/lib64/libmyodbc9S.so
set ODBCINI = /etc/odbc.ini
EOF
2. listener.ora 및 tnsnames.ora 파일을 사용하여 원격 데이터베이스를 수신하고 있는지 확인하려면 다음 명령을 실행합니다.
다음 예제와 같은 결과가 나타나야 합니다.
$ tnsping TESTDB
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 14-SEP-2024 09:01:37
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/opt/oracle/product/19c/dbhome_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID = TESTDB)) (HS = OK))
OK (0 msec)
데이터베이스 링크로 MySQL 쿼리 수행
이제 Oracle Database Gateways가 구성된 Oracle 데이터베이스에 연결할 수 있습니다. 다음 명령을 실행하여 데이터베이스 링크를 생성합니다. <MasterUserPassword>
에는 CloudFormation 스택을 시작할 때 입력한 비밀번호를 사용합니다.
sqlplus / as sysdba
CREATE public DATABASE LINK TESTDB CONNECT TO "admin" IDENTIFIED BY "<MasterUserPassword>" USING 'TESTDB';
해당 데이터베이스 링크를 통해 MySQL 쿼리가 작동하는지 확인하려면 다음 쿼리를 실행합니다.
select * from "employee"@TESTDB;
The following code shows the expected output:
SQL> select * from "employee"@TESTDB;
empno ename job
---------- -------------------- --------------------
1 K i n g P r e s i d e n t
2 B l a k e M a n a g e r
3 S c o t t A n a l y s t
SQL>
PL/SQL로 Oracle 데이터 마이그레이션
Oracle PL/SQL을 사용하면 단일 SQL이 지원하지 않는 많은 기능을 구현할 수 있습니다. 이 섹션에서는 PL/SQL로 Oracle 데이터를 마이그레이션하는 방법을 설명드립니다.
소스 테이블 및 데이터 생성
Oracle Database Gateways를 사용하면 온프레미스의 Oracle 데이터베이스에 원격으로 연결한 후, 타겟 데이터베이스인 MySQL에 데이터를 삽입할 수 있습니다. 이를 테스트하기 위해 온프레미스 VPC의 Oracle에 연결하고 다음 테이블과 데이터를 준비합니다.
sqlplus admin/$MASTER_USER_PASSWORD@//$SOURCE_ORACLE_URL:1521/ORCLSRC <<SQLEOF
create table customers (
customer_id number,
name varchar2(50)
);
insert into customers
select level,
'Customer ' || level
from dual
connect by level <= 10;
commit;
exit;
SQLEOF
소스 데이터베이스에 대한 데이터베이스 링크 구성
다음 명령을 사용하여 소스 데이터베이스에 데이터베이스 링크를 생성합니다. <MasterUserPassword>에는 CloudFormation 스택을 시작할 때 입력한 비밀번호를 사용합니다.
sqlplus / as sysdba <<SQLEOF
CREATE DATABASE LINK ORCLSRC
CONNECT TO admin IDENTIFIED BY <MasterUserPassword>
USING '(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=$SOURCE_ORACLE_URL)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=ORCLSRC))
)';
exit;
SQLEOF
마이그레이션 테스트 수행
데이터를 마이그레이션하는 간단한 방법은 소스 데이터베이스에서 테이블을 읽고 타겟 데이터베이스의 테이블에 데이터를 삽입하는 것입니다. 이를 위해 먼저 MySQL에 빈 테이블을 생성하기 위해 다음 명령을 실행합니다.
cat << EOF > empty_table.sql
use testdb
create table customers (
customer_id int,
name varchar(50)
);
EOF
mysql -u admin -h $TARGET_AURORA_MYSQL_URL -p$MASTER_USER_PASSWORD < empty_table.sql
다음 메시지가 표시되면 무시해도 됩니다.
mysql: [Warning] Using a password on the command line interface can be insecure.
이 메시지는 명령줄의 비밀번호가 안전하지 않다는 의미입니다. 실제 워크로드에 적용시에는 안전한 비밀번호를 사용하시면 됩니다.
INSERT SELECT 구문을 사용하여 소스 데이터베이스에서 테이블을 읽고 타겟 데이터베이스의 테이블에 데이터를 직접 삽입할 수 있습니다. 다음 구문을 사용하여 삽입을 수행합니다.
sqlplus / as sysdba
insert into "customers"@TESTDB select * from customers@ORCLSRC;
그러나, 다음 예제와 유사한 오류가 발생하고 쿼리가 삽입할 수 없습니다. 이는 Oracle이 SQL 문당 하나의 데이터베이스 링크 작업만 허용하기 때문입니다.
SQL> insert into "customers"@TESTDB select * from customers@ORCLSRC;
Insert into "customers"@TESTDB select * from customers@ORCLSRC
*
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[MySQL][ODBC 9.0(w) Driver][mysqld-8.0.32]You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '@ORCLSRC!' at line 1 {42000,NativeErr = 1064}
ORA-02063: preceding 2 lines from TESTDB
PL/SQL 커서로 마이그레이션 테스트
앞서 언급된 제약 조건을 해결하기 위해 하나의 SQL 문은 하나의 원격 데이터베이스 연결을 사용해야 합니다. 두 데이터베이스 간에 데이터를 처리하는 경우, 두 원격 데이터베이스 연결에서 처리를 수행해야 합니다. Oracle의 PL/SQL 구문을 사용하면 이를 구현할 수 있습니다. 다음 PL/SQL 구문을 사용하여 소스 데이터베이스에서 데이터를 가져와 타겟 데이터베이스에 삽입하는 방법을 살펴보겠습니다.
SET SERVEROUTPUT ON
set timing on
BEGIN
FOR csr_data
IN (SELECT *
FROM customers@ORCLSRC)
LOOP
INSERT INTO "customers"@TESTDB
VALUES (csr_data.CUSTOMER_ID,
csr_data.NAME);
END LOOP;
END;
/
SHOW ERRORS
Commit;
다음 쿼리로 데이터가 성공적으로 삽입되었는지 확인합니다.
select * from "customers"@TESTDB;
다음 출력은 삽입이 성공적으로 수행되었음을 보여주는 예상 결과입니다.
SQL> Select * from "customers"@TESTDB ;
customer_id name
----------- --------------------------------------------------
1 C u s t o m e r 1
2 C u s t o m e r 2
3 C u s t o m e r 3
4 C u s t o m e r 4
5 C u s t o m e r 5
6 C u s t o m e r 6
7 C u s t o m e r 7
8 C u s t o m e r 8
9 C u s t o m e r 9
10 C u s t o m e r 1 0
10 rows selected.
Elapsed: 00:00:00.01
SQL>
AWS DMS 제한사항에 대한 테스트
앞의 테스트에서 볼 수 있듯이 PL/SQL을 사용하면 다양한 유형의 요구 사항을 처리할 수 있습니다. 두 데이터베이스 간의 레이아웃 변경도 처리할 수 있습니다. AWS DMS가 지원하지 않는 특수한 경우에도 간단한 PL/SQL로 마이그레이션을 수행할 수 있습니다.
30자 이상의 테이블 이름
AWS DMS의 일반적인 제한 사항은 30자보다 긴 테이블 이름을 지원하지 않는다는 것입니다. 이 테스트에서는 마이그레이션이 잘 진행되는지 테스트하기 위해 소스 Oracle 데이터베이스에 30자보다 긴 테이블 이름을 생성합니다.
1. 소스 Oracle 데이터베이스에 30자보다 긴 테이블 이름을 생성합니다.
sqlplus admin/$MASTER_USER_PASSWORD@//$SOURCE_ORACLE_URL:1521/ORCLSRC << SQLEOF
drop table long_tabname_1234567890_1234567890_1234567890;
create table long_tabname_1234567890_1234567890_1234567890 (
customer_id number,
name varchar2(50)
);
insert into long_tabname_1234567890_1234567890_1234567890
select level,
'Customer ' || level
from dual
connect by level <= 10;
commit;
exit;
SQLEOF
2. 타겟 MySQL 데이터베이스에 동일한 테이블 이름을 생성합니다.
cat << EOF > long_tabname_test.sql
use testdb
create table long_tabname_1234567890_1234567890_1234567890 (
customer_id int,
name varchar(50)
);
EOF
mysql -u admin -h $TARGET_AURORA_MYSQL_URL -p$MASTER_USER_PASSWORD < long_tabname_test.sql
3. 마이그레이션을 수행하는 프로시저를 실행하고 결과를 확인합니다.
sqlplus / as sysdba
SET SERVEROUTPUT ON
set timing on
BEGIN
FOR csr_data
IN (SELECT *
FROM long_tabname_1234567890_1234567890_1234567890@ORCLSRC)
LOOP
INSERT INTO "long_tabname_1234567890_1234567890_1234567890"@TESTDB
VALUES (csr_data.CUSTOMER_ID,
csr_data.NAME);
END LOOP;
END;
/
SHOW ERRORS
Commit;
Select * from "long_tabname_1234567890_1234567890_1234567890"@TESTDB ;
마이그레이션이 잘 진행될 때 예상되는 출력은 다음과 같습니다.
customer_id name
----------- --------------------------------------------------
1 C u s t o m e r 1
2 C u s t o m e r 2
3 C u s t o m e r 3
4 C u s t o m e r 4
5 C u s t o m e r 5
6 C u s t o m e r 6
7 C u s t o m e r 7
8 C u s t o m e r 8
9 C u s t o m e r 9
10 C u s t o m e r 1 0
10 rows selected.
Virtual columns
AWS DMS는 Oracle 데이터베이스에 가상 열이 정의된 경우 마이그레이션을 지원하지 않습니다. 이 경우에도 Oracle Database Gateways를 사용하여 마이그레이션을 수행할 수 있습니다.
1. 소스 데이터베이스에 테이블을 생성합니다.
sqlplus admin/$MASTER_USER_PASSWORD@//$SOURCE_ORACLE_URL:1521/ORCLSRC << SQLEOF
Drop table virtual_col_tab;
create table virtual_col_tab (
id number,
product varchar2(50),
price number,
price_with_tax number generated always as (round(price*1.2,2)) virtual
);
insert into virtual_col_tab (id, product, price) values (1, 'computer', 1500);
insert into virtual_col_tab (id, product, price) values (2, 'bike', 1000);
commit;
col product for a15
select * from virtual_col_tab;
exit;
SQLEOF
2. 타겟 MySQL 데이터베이스에 타겟 테이블을 생성합니다.
cat <<EOF > virtual_col_tab_test.sql
use testdb
create table virtual_col_tab (
id int,
product varchar(50),
price int,
price_with_tax int
);
EOF
mysql -u admin -h $TARGET_AURORA_MYSQL_URL -p$MASTER_USER_PASSWORD < virtual_col_tab_test.sql
3. Oracle Database Gateways에 연결하고 마이그레이션을 수행합니다.
sqlplus / as sysdba
SET SERVEROUTPUT ON
set timing on
BEGIN
FOR csr_data
IN (SELECT *
FROM virtual_col_tab@ORCLSRC)
LOOP
INSERT INTO "virtual_col_tab"@TESTDB
VALUES (csr_data.id,
csr_data.product,
csr_data.price,
csr_data.price_with_tax);
END LOOP;
END;
/
SHOW ERRORS
Commit;
col product for a20
Select * from "virtual_col_tab"@TESTDB;
다음은 예상되는 출력입니다.
SQL>
id product price price_with_tax
---------- -------------------- ---------- --------------
1 c o m p u t e r 1500 1800
2 b i k e 1000 1200
결론
Oracle Database에서 Aurora MySQL 호환 또는 Amazon RDS for MySQL로의 마이그레이션은 클라우드로 전환하는 고객에게 중요한 단계입니다. Oracle Database Gateways를 사용하면 기존 Oracle 데이터베이스와 Aurora MySQL 호환 또는 Amazon RDS for MySQL 간에 데이터를 원활하게 마이그레이션할 수 있습니다. 별도의 Oracle Database Gateways 시스템을 구성하면 온프레미스 및 AWS 환경 모두에서 일관된 마이그레이션 접근 방식을 구현할 수 있으며, 이는 소스 Oracle 데이터베이스의 구성을 변경하지 않아 보안 위험을 줄입니다. AWS DMS의 제한 사항으로 인해 마이그레이션에 어려움이 있다면, Oracle Database Gateways는 이를 해결할 수 있는 대안으로써 활용할 수 있습니다.