【OCIクラウド移行ガイド】とは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニアによる、OCI移行手順をまとめたシリーズ記事です。 各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。 まとめ記事は以下になります。
今回移行するサービス:Amazon RDS for Oracle
今回、移行対象とするのはAmazon RDS for Oracleです。 Oracle Databaseの一般的な移行方式であるDataPumpを使用して移行します。DataPumpは汎用的で馴染みのある方法ですが、移行時にダウンタイムを要しますので、GoldenGateなど他の移行方式を検討する必要があります。その他の移行方式については、以下のページにまとめがあります。
前提条件
下記のリソースを事前に用意しておく必要があります。
Cloud | リソース | 今回の環境 |
---|---|---|
AWS | RDS for Oracle | ・Oracle Database 19c Standard Edition 2 ・今回使用しているデータベース名: database-1 ・参考:RDS for Oracle作成チュートリアル |
AWS | S3 | ・今回使用しているバケット名:basedb2s3 ・Step0-1でバケットのARNが必要 |
OCI | Base Database | ・OCI Base Database Standard Edition ・Private Subnetに配置 ・今回使用しているデータベース名: basedb1 ・参考:Base Database作成チュートリアル |
OCI | NAT Gateway | ・データ取得のためにNAT Gatewayを利用 ・参考:NAT Gateway作成方法 |
移行フロー
Step0. S3とRDSとの連携設定
Step1. RDS for OracleからData Pumpを使ってデータをエクスポート
Step2. S3のDumpファイルをOCI Base Databaseに転送
Step3. DumpファイルをBase Databaseにインポート
Step0. S3とRDSとの連携設定
・Step0-1.IAMポリシーの作成
・Step0-2.IAMロールの作成
・Step0-3.IAMロールをRDSインスタンスに関連付ける
・Step0-4.オプション・グループの作成
・Step0-5.オプション・グループをRDSインスタンスに関連付ける
上記の作業が全て行えていないと、RDSにS3用のパッケージ(例:rdsadmin.rdsadmin_s3_tasks
)が作成されず、Step2で"ORA-00904: "RDSADMIN"."RDSADMIN_S3_TASKS"."UPLOAD_TO_S3": invalid identifier"
というエラーが発生しますのでご注意ください。
Step0-1. IAMポリシーの設定
AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の「ステップ 1: Amazon RDS ロール用の IAM ポリシーを作成する」の手順を実行します。
-
「アクション許可」セクションから下記を選択します。
・リスト:ListBucket
・読み取り:GetObject
・書き込み:PutObject
・書き込み:DeleteObject
・許可の管理:PutObjectAcl
-
ポリシーの名前と説明を記載して「ポリシーの作成」ボタンを押します。
・ポリシー名:rds-s3-integration-policy
(任意)
Step0-2. IAMロールの作成
AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の続きの「ステップ 3: DB インスタンスの IAM ロールを作成し、ポリシーをアタッチする」の手順を実行します。
Step0-3. IAMロールをRDSインスタンスに関連付ける
AWS RDSユーザーズガイド「Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定」の「ステップ 4: IAM ロールを RDS for Oracle DB インスタンスに関連付ける」の手順を実行します。
-
移行元データベースの詳細画面に行きます。
-
「IAMロールの管理」セクションで「S3_INTEGRATION に適用するロールを選択して「ロールの追加」を行います。
・このインスタンスにIAMのロールを追加:Step0-2で作成したロールを指定
・機能:S3_INTERGRATION
を選択
Step0-4. オプション・グループの作成
AWS RDSユーザーズガイド「Amazon S3 統合オプションの追加」の手順を実行します。
RDS では、新しい DB インスタンスごとに空のデフォルトオプショングループが用意されます。このデフォルトオプショングループを変更することはできないので、新しいオプショングループを作成します。
1.RDSのページの「リソース」から「オプショングループ」を選択します。
2.オプショングループのページから「グループの作成」ボタンを押します。
3.「オプショングループの作成」画面で必要事項を入力して「作成」を押します。
・名前:rds-option-group
(必須項目)
・エンジン:移行元のOracleDBのタイプを選択(今回はoracle-se2
)
・メジャーエンジンバージョン:移行元のOracleDBのバージョンを選択 (今回は19
)
5.「オプション」セクションの右上にある「オプションの追加」ボタンを押します。
6.「オプションの追加」画面で必要事項を入力して「作成」を押します。
・オプション名:S3_INTEGRATION
・すぐに適用:Yes
7.コンソール画面からも新しく作成したオプション・グループに「S3_INTEGRATION」が追加されたことが確認できます。
Step0-5. オプション・グループに関連付ける
Step0-4に引き続き、AWS RDSユーザーズガイド「Amazon S3 統合オプションの追加」の手順を実行します。
この部分はユーザーズガイドにあまり明示的に記載がないので、この手順を飛ばしがちなのでご注意ください。
Step1. RDS for OracleからData Pumpを使ってデータをエクスポート
・Step1-1.Data Pumpを使ってデータをエクスポート
・Step1-2.エクスポートしたデータをS3に転送
Step1-1. Data Pumpを使ってデータをエクスポート
-
ADMINユーザでRDSに接続します。
-
Dumpファイルを一旦ディレクトリ・オブジェクトに置くので、ディレクトリの確認をします。RDSでは、DataPump用のDATA_PUMP_DIRディレクトリオブジェクトが用意されており、dumpファイルにてこのOS領域を利用できます。
SELECT * FROM dba_directories
WHERE directory_name='DATA_PUMP_DIR';
OWNER DIRECTORY_NAME DIRECTORY_PATH ORIGIN_CON_ID
---------- --------------- ----------------------- -------------
SYS DATA_PUMP_DIR /rdsdbdata/datapump 0
3.DBMS_DATAPUMPプロシージャを使ってExportを実行
AWS RDSユーザーズガイド「Oracle Data Pump を使用したインポート」の「ステップ 2: DBMS_DATAPUMP を使用してデータをダンプファイルにエクスポートする」の手順を実行します。
手順が多いように見えますが、下記の5箇所を修正すればすぐに実行できます。
・DBMS_DATAPUMP.OPEN:エクスポート操作をするハンドラを作成します。
・DBMS_DATAPUMP.ADD_FILE(1個目):DUMPファイルを指定します。
‐ filename:DUMPファイルの名前を指定(今回の場合は exp_scott.dmp
)
‐ filename:ディレクトリオブジェクト名を指定(今回の場合は DATA_PUMP_DIR
)
・DBMS_DATAPUMP.ADD_FILE(2個目):ログファイルを指定します。
‐ filename:ログファイルの名前を指定(今回の場合は exp_scott.log
)
‐ directory:ディレクトリオブジェクト名を指定(今回の場合は DATA_PUMP_DIR
)
・DBMS_DATAPUMP.METADATA_FILTER:スキーマを指定します。
‐ value:ディレクトリオブジェクト名を指定(今回の場合は SCOTT
)
・DBMS_DATAPUMP.START_JOB:ジョブを開始します。
・DBMS_DATAPUMP.WAIT_FOR_JOB:ジョブが終了するのを待ちます。
DECLARE
hndl NUMBER;
status VARCHAR2(20);
BEGIN
hndl := DBMS_DATAPUMP.OPEN(
operation => 'EXPORT',
job_mode => 'SCHEMA',
job_name => null);
DBMS_DATAPUMP.ADD_FILE(
handle => hndl,
filename => 'exp_scott.dmp',
directory => 'DATA_PUMP_DIR',
filetype => dbms_datapump.ku$_file_type_dump_file,
reusefile => 1);
DBMS_DATAPUMP.ADD_FILE(
handle => hndl,
filename => 'exp_scott.log',
directory => 'DATA_PUMP_DIR',
filetype => dbms_datapump.ku$_file_type_log_file,
reusefile => 1);
DBMS_DATAPUMP.METADATA_FILTER(
handle => hndl,
name => 'SCHEMA_EXPR',
value => 'IN (''SCOTT'')');
DBMS_DATAPUMP.START_JOB(
handle => hndl);
DBMS_DATAPUMP.WAIT_FOR_JOB(
handle => hndl,
job_state => status);
END;
/
PL/SQL procedure successfully completed.
4.ディレクトリオブジェクトの中身を確認します。
・p_directory:ディレクトリオブジェクト名を指定(今回の場合は DATA_PUMP_DIR
)
col filename format a30
SELECT * FROM table
(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
FILENAME TYPE FILESIZE MTIME
------------------------------ ---------- ---------- ---------
datapump/ directory 4096 18-DEC-24
exp_scott.log file 638 18-DEC-24
exp_scott.dmp file 319488 18-DEC-24
5.実行ログを確認します。
・ディレクトリオブジェクト名を指定(今回の場合は DATA_PUMP_DIR
)
・上記3で指定したログファイル名を指定(今回の場合は exp_scott.log
)
col text for a100
set pagesize 100
SELECT text FROM
TABLE(RDSADMIN.RDS_FILE_UTIL.READ_TEXT_FILE('DATA_PUMP_DIR','exp_scott.log'));
TEXT
--------------------------------------------------------------------------------
Starting "ADMIN"."SYS_EXPORT_SCHEMA_01":
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exported "SCOTT"."DEPT" 6.023 KB 4 rows
. . exported "SCOTT"."EMP" 8.773 KB 14 rows
Master table "ADMIN"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for ADMIN.SYS_EXPORT_SCHEMA_01 is:
/rdsdbdata/datapump/exp_scott.dmp
Job "ADMIN"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Dec 31 08:02:46
2024 elapsed 0 00:00:28
21 rows selected.
RDS for Oracle環境でData Pump APIを使用した際にエラーが出たときの対処法がまとまっている記事がありますので、うまく行かない場合はこちらをご参照ください。
https://repost.aws/ja/knowledge-center/rds-oracle-dmbs-datapump-errors
Step1-2.エクスポートしたデータをS3に転送
AWS RDSユーザーズガイド「Amazon RDS for Oracle と Amazon S3 バケットの間でファイルを転送する」の手順を実行します。
ユーザーズガイドに「ファイル転送の要件と制限」があるので、必要に応じて確認をしてください。
- DumpファイルをS3に転送するプロシージャを実行する。
下記コマンドはDumpファイルのみを転送していますが、必要に応じてファイル名を変えてログファイルも転送して、Exportの実行ログを確認してください。
・p_bucket_name:S3のバケット名を指定(今回の場合はbasedb2s3
)
・p_prefix:Step1-1で作成したDumpファイル名を指定(今回の場合はexp_scott.dmp
)
・p_s3_prefix:S3のフォルダ名を指定(今回の場合はdumpfiles
)
・p_directory_name:Step1−1で使用したディレクトリオブジェクト名を指定(今回の場合はDATA_PUMP_DIR
)
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
p_bucket_name => 'basedb2s3',
p_prefix => 'exp_scott.dmp',
p_s3_prefix => 'dumpfiles/',
p_directory_name => 'DATA_PUMP_DIR')
AS TASK_ID FROM DUAL;
TASK_ID
------------------------------------------------
1734504448730-198
2.プロシージャ実行のログを確認する。
dbtask-<TASK_ID>.log
というファイル名でログが出力されるので内容を確認します。
SELECT text FROM table
(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1734504448730-198.log'));
TEXT
--------------------------------------------------------------------------------
2024-12-18 06:47:28.972 UTC [INFO ] File #1: Uploading the file /rdsdbdata/datap
ump/exp_scott.dmp to Amazon S3 with bucket name basedb2s3 and key dumpfiles/exp_
scott.dmp.
2024-12-18 06:47:29.121 UTC [INFO ] The file /rdsdbdata/datapump/exp_scott.dmp w
as uploaded to Amazon S3 with bucket name basedb2s3 and key dumpfiles/exp_scott.
dmp.
2024-12-18 06:47:29.134 UTC [INFO ] The task finished successfully.
4.Dumpファイルの詳細外面でオブジェクトURLを確認します。(後で利用)
Step2. S3のDumpファイルをOCI Base Databaseに転送
このガイドでは、下記のサイトで紹介されている「パブリックアクセスブロック機能は有効のままでS3のファイルをHTTPでダウンロードする」方法を使って、Base Databaseにファイルを転送します。設定内容の説明が書いてあるので、詳細はこちらの記事をご覧ください。
この方法の他にも、0CI Object Storageにコピーする方法など様々な方式がQiita等で紹介されていますので、要件に応じてご検討ください。
下記の手順で行います。Step2-3だけはAWSで実施し、その他はOCI側の作業です。
Step2-1. Base Databaseにアクセスする。
Step2-2. Base DatabaseのNAT Gateway経由の外に出た時のGlobal IPアドレスを確認する。
Step2-3. バケットのポリシーを変更する。
Step2-4. S3からBaseDatabaseにDumpファイルを取得する。
Step2-1. Base Databaseにアクセスする。
Private SubnetにあるBase Databaseを想定しているので、IPSecVPNやBastionサービス、踏み台サーバ等を使ってアクセスしてください。Step2-2. Base DatabaseのNAT Gateway経由の外に出た時のGlobal IPアドレスを確認する。
ここで取得したIPアドレスはStep2-3で使用します。curl ifconfig.io
[opc@dbse2 ~]$ curl ifconfig.io
xxx.xxx.xxx.xxx
Step2-3. バケットのポリシーを変更する。
2.「ブロックパブリックアクセス」で「パブリック・アクセスをすべてブロック」はオンのままにします。
3.「バケットポリシー」から「編集」ボタンを押して「バケットポリシーの編集」画面に行き、バケットのポリシーに下記を記載します。
・Resource:今回は basedb2se3
に変更
・IP Address:Step2-2で取得したIPアドレスに/32をつけて記載します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::basedb2s3/*"],
"Condition": {
"IpAddress": {
"aws:SourceIp": ["xxx.xxx.xxx.xxx/32"]
}
}
}
]
}
Step2-4.S3からBaseDatabaseにDumpファイルを取得する。
1.Oracleユーザに変更します。
sudo su -
su - oracle
[opc@dbse2 ~]$ sudo su -
Last login: Wed Dec 25 14:03:18 UTC 2024
[root@dbse2 ~]# su - oracle
Last login: Wed Dec 25 14:03:18 UTC 2024
Last failed login: Wed Dec 25 14:03:32 UTC 2024 on pts/0
There was 1 failed login attempt since the last successful login.
2.Dumpファイル配置用のディレクトリを作成して移動する。
mkdir /home/oracle/dumpfile
cd /home/oracle/dumpfile
[oracle@dbse2 ~]$ mkdir /home/oracle/dumpfile
[oracle@dbse2 ~]$ cd /home/oracle/dumpfile
[oracle@dbse2 dumpfile]$
3.Dumpファイルをダウンロードする。
wget https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
[oracle@dbse2 dumpfile]$ wget https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
--2024-12-31 07:20:30-- https://basedb2s3.s3.ap-northeast-1.amazonaws.com/dumpfiles/exp_scott.dmp
Resolving basedb2s3.s3.ap-northeast-1.amazonaws.com (basedb2s3.s3.ap-northeast-1.amazonaws.com)... 3.5.158.194, 3.5.159.184, 52.219.199.54, ...
Connecting to basedb2s3.s3.ap-northeast-1.amazonaws.com (basedb2s3.s3.ap-northeast-1.amazonaws.com)|3.5.158.194|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 589824 (576K) [application/octet-stream]
Saving to: ‘exp_scott.dmp’
exp_scott.dmp 100%[===================================================================================================================================>] 576.00K 524KB/s in 1.1s
2024-12-31 07:20:33 (524 KB/s) - ‘exp_scott.dmp’ saved [589824/589824]
4.Dumpファイルを確認する。
ls -l
[oracle@dbse2 dumpfile]$ ls -l
total 576
-rw-r--r-- 1 oracle oinstall 589824 Dec 31 07:14 exp_scott.dmp
Step3. DumpファイルをBase Databaseにインポート
・Step3-1.ディレクトリ・オブジェクトを作成する。
・Step3-2.ダウンロードしたDumpファイルをインポートする。
Step3-1.ディレクトリ・オブジェクトを作成する。
1.SQL*PlusでBase DatabaseのPDBに接続する。
sqlplus system/<password>@pdb1
[oracle@dbse2 ~]$ sqlplus system/<password>@pdb1
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 31 05:54:39 2024
Version 19.25.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Last Successful login time: Tue Dec 31 2024 05:52:04 +00:00
Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.25.0.0.0
SQL>
2.先ほど作成したディレクトリをimpdirというディレクトリ・オブジェクトとして作成する。
create directory impdir as '/home/oracle/dumpfile';
SQL> create directory impdir as '/home/oracle/dumpfile';
Directory created.
3.作成されたディレクトリ・オブジェクトを確認する。
select * from dba_directories where directory_name = 'IMPDIR';
SQL> select * from dba_directories where directory_name = 'IMPDIR';
OWNER
--------------------------------------------------------------------------------
DIRECTORY_NAME
--------------------------------------------------------------------------------
DIRECTORY_PATH
--------------------------------------------------------------------------------
ORIGIN_CON_ID
-------------
SYS
IMPDIR
/home/oracle/dumpfile
3
4.(必要に応じて)ディレクトリアクセスに必要な権限をExportするユーザに与える。
grant read,write on directory impdir to <user_name>;
Step3-2.ダウンロードしたDumpファイルをインポートする。
1.Oracleユーザのコマンドラインからimpdpコマンドを実行する。
impdp system/<password>@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp log=exp_scott.log
[oracle@dbse2 ~]$ impdp system/<password>@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp log=exp_scott.log
Import: Release 19.0.0.0.0 - Production on Tue Dec 31 08:19:05 2024
Version 19.25.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "log=exp_scott.log" Location: Command Line, Replaced with: "logfile=exp_scott.log"
Master table "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01": system/********@pdb1 schemas=scott directory=IMPDIR dumpfile=exp_scott.dmp logfile=exp_scott.log
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."DEPT" 6.023 KB 4 rows
. . imported "SCOTT"."EMP" 8.773 KB 14 rows
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully completed at Tue Dec 31 08:19:12 2024 elapsed 0 00:00:06
2.SCOTTユーザで接続して表がインポートされているのを確認する。
sqlplus -s system/<password>@pdb1 <<EOF
select table_name from dba_tables where owner='SCOTT';
exit
EOF
[oracle@dbse2 ~]$ sqlplus -s system/<password>@pdb1 <<EOF
> select table_name from dba_tables where owner='SCOTT';
> exit
> EOF
TABLE_NAME
------------------------------------------------------------------------------
EMP
DEPT
以上