はじめに
2/16のAWS blogにて Migrate your Oracle pluggable database to Amazon RDS for Oracle が発表されました。
RDS for Oracleもマルチテナント構成(※)がサポートされたのは最近だったので、ついに PDB の Unplug & Plug で移行できるようになったのかな、と思ったのですが残念ながらblogの内容は PDB のスキーマを全てexpdpして、それをRDSへimpdpする、という物でした。
(※)正確にはRDSはCDBとPDBが1:1となるシングルテナント構成のみがサポートされています
とはいえ、このような形の移行も利用される方がいらっしゃるだろうし、blogではS3からのimpdpだったこともあり EFS統合 を利用した方が効率的では?と思ったりしたので、EFSからimpdpで移行する方法を試してみることにしました。
ちなみに、RDS Custom for Oracleは2022年11月に マルチテナント構成がサポートされたため、Unplug & Plugでの移行が可能になると思われます。
RDS for Oracleへの移行
構成の概要
ソースのマルチテナントのデータベースからターゲットとなるRDS for Oracleへデータインポートを行います。
今回は以下のような構成で実施しました。
- ソース:21c XE (XEPDB1)
- ターゲット:19c SE2 (TESTDB02)
なお、RDS for Oracleをマルチテナント構成で作成すると、CDBは固定で RDSCDB となります。また、CDBへのアクセス方法が提供されていないため、特に意識する必要はないと思います。
前提条件
元の blog にはいろいろと前提が書いてありますが、結局expdp/impdpで移行するのであまり意識する必要はないと思います。
ソース Oracle データベースからデータをエクスポートする
ソースの21c XEPDB1 に接続して、スキーマを確認します。
SQL> SELECT p.PDB_ID, p.PDB_NAME, t.OWNER, t.TABLE_NAME
2 FROM DBA_PDBS p, CDB_TABLES t
3 WHERE p.PDB_ID > 2 AND
4 t.owner not like '%SYS%' and t.OWNER NOT IN ('ORDDATA','DBSFWUSER',
5 'CTXSYS',
6 'RDSADMIN','PUBLIC',
7 'XDB',
8 'OUTLN',
9 'ORACLE_OCM',
10 'DBSNMP',
11 'DBUPTIME',
12 'GSMADMIN_INTERNAL',
13 'SVCSAMLMSRO',
14 'REMOTE_SCHEDULER_AGENT','PERFSTAT')
15 /
PDB_ID PDB_NAME OWNER TABLE_NAME
---------- ---------- ---------- ----------
3 XEPDB1 SCOTT DEPT
3 XEPDB1 SCOTT EMP
3 XEPDB1 SCOTT BONUS
3 XEPDB1 SCOTT SALGRADE
3 XEPDB1 TESTUSR CTRTBL
3 XEPDB1 TESTUSR TEST
3 XEPDB1 TESTUSR T1
7行が選択されました。
SCOTTスキーマとTESTUSRスキーマがユーザスキーマになるため、データポンプでエクスポートします。
今回は21cから19cにインポートするので、VERSIONパラメータで19.0.0を指定しておきます。
C:¥>expdp '/@xepdb1 as sysdba' directory=TESTDIR dumpfile=21cscott.expdp.dump logfile=TESTDIR:20230217_scott.log job_name=job_expdp1 VERSION=19.0.0 schemas=SCOTT,TESTUSR
Export: Release 21.0.0.0.0 - Production on 金 2月 17 14:09:59 2023
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
"SYS"."JOB_EXPDP1"を起動しています: "/********@xepdb1 AS SYSDBA" directory=TESTDIR dumpfile=21cscott.expdp.dump logfile=TESTDIR:20230217_scott.log job_name=job_expdp1 VERSION=19.16.0 schemas=SCOTT,TESTUSR
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
オブジェクト型SCHEMA_EXPORT/USERの処理中です
オブジェクト型SCHEMA_EXPORT/SYSTEM_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/ROLE_GRANTの処理中です
オブジェクト型SCHEMA_EXPORT/DEFAULT_ROLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLESPACE_QUOTAの処理中です
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTの処理中です
. . "SCOTT"."EMP" 8.695 KB 12行がエクスポートされました
. . "SCOTT"."DEPT" 6.023 KB 4行がエクスポートされました
. . "TESTUSR"."TEST" 5.976 KB 3行がエクスポートされました
. . "SCOTT"."SALGRADE" 5.953 KB 5行がエクスポートされました
. . "TESTUSR"."CTRTBL" 5.523 KB 5行がエクスポートされました
. . "TESTUSR"."T1" 5.070 KB 4行がエクスポートされました
. . "SCOTT"."BONUS" 0 KB 0行がエクスポートされました
マスター表"SYS"."JOB_EXPDP1"は正常にロード/アンロードされました
******************************************************************************
SYS.JOB_EXPDP1に設定されたダンプ・ファイルは次のとおりです:
I:\EXPDIR\21CSCOTT.EXPDP.DUMP
ジョブ"SYS"."JOB_EXPDP1"が金 2月 17 14:10:50 2023 elapsed 0 00:00:50で正常に完了しました
ターゲット(RDS for Oracle)にデータをインポートする
ターゲットとなる19c SE2 RDS for Oracleについては、予めEFS統合を設定しておきます。
EFS統合については以前の Amazon RDS for Oracle と Amazon Elastic File System (EFS) 統合を試してみた を参照ください。
ターゲットとなるRDS側の情報を確認します、CDBはRDSCDBとなっていることが確認できます。
また、PDB側にユーザスキーマがないことも確認できます。
SQL> select name, created, platform_name, cdb from v$database;
NAME CREATED PLATFORM_NAME CDB
--------- --------- -------------------------------- - ---
RDSCDB 17-SEP-22 Linux x86 64-bit YES
SQL> select pdb_name, status from cdb_pdbs;
PDB_NAME STATUS
--------------- ----------
TESTDB02 NORMAL
SQL> SELECT p.PDB_ID, p.PDB_NAME, t.OWNER, t.TABLE_NAME
FROM DBA_PDBS p, CDB_TABLES t
WHERE p.PDB_ID > 2 AND
t.owner not like '%SYS%' and t.OWNER NOT IN ('ORDDATA','DBSFWUSER',
'CTXSYS',
'RDSADMIN','PUBLIC',
'XDB',
'OUTLN',
'ORACLE_OCM',
'DBSNMP',
'DBUPTIME',
'GSMADMIN_INTERNAL',
'SVCSAMLMSRO',
'REMOTE_SCHEDULER_AGENT','PERFSTAT')
/
no rows selected
ソースデータからエクスポートしたデータを、ターゲットにインポートします。
$ impdp admin/********@testdb02.**********.ap-northeast-1.rds.amazonaws.com:1521/TESTDB02 directory=DPDIR_EFS dumpfile=21CSCOTT.EXPDP.DUMP logfile=20230217_impdp.log
Import: Release 21.0.0.0.0 - Production on Fri Feb 17 06:56:45 2023
Version 21.8.0.0.0
Copyright (c) 1982, 2022, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Master table "ADMIN"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "ADMIN"."SYS_IMPORT_FULL_01": admin/********@testdb02.**********.ap-northeast-1.rds.amazonaws.com:1521/TESTDB02 directory=DPDIR_EFS dumpfile=21CSCOTT.EXPDP.DUMP logfile=20230217_impdp.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"."EMP" 8.695 KB 12 rows
. . imported "SCOTT"."DEPT" 6.023 KB 4 rows
. . imported "TESTUSR"."TEST" 5.976 KB 3 rows
. . imported "SCOTT"."SALGRADE" 5.953 KB 5 rows
. . imported "TESTUSR"."CTRTBL" 5.523 KB 5 rows
. . imported "TESTUSR"."T1" 5.070 KB 4 rows
. . imported "SCOTT"."BONUS" 0 KB 0 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 "ADMIN"."SYS_IMPORT_FULL_01" successfully completed at Fri Feb 17 15:57:22 2023 elapsed 0 00:00:34
ターゲットでオブジェクトが作成されている事を確認します。
SQL> SELECT p.PDB_ID, p.PDB_NAME, t.OWNER, t.TABLE_NAME
FROM DBA_PDBS p, CDB_TABLES t
WHERE p.PDB_ID > 2 AND
t.owner not like '%SYS%' and t.OWNER NOT IN ('ORDDATA','DBSFWUSER',
'CTXSYS',
'RDSADMIN','PUBLIC',
'XDB',
'OUTLN',
'ORACLE_OCM',
'DBSNMP',
'DBUPTIME',
'GSMADMIN_INTERNAL',
'SVCSAMLMSRO',
'REMOTE_SCHEDULER_AGENT','PERFSTAT')
/
PDB_ID PDB_NAME OWNER TABLE_NAME
---------- ---------- ---------- ----------
3 TESTDB02 SCOTT BONUS
3 TESTDB02 TESTUSR TEST
3 TESTDB02 SCOTT EMP
3 TESTDB02 SCOTT SALGRADE
3 TESTDB02 TESTUSR T1
3 TESTDB02 TESTUSR CTRTBL
3 TESTDB02 SCOTT DEPT
7 rows selected.
まとめ
これでデータの移行は完了となり、ソースのオンプレのPDBのデータがターゲットのRDS for Oracleに移行されました。
手順としては簡単ですが、データ量によってはやはり時間がかかってきますので、利用する際には検証が必要だと思います。
AWSのblogではインポート後にトリガやシーケンスのメンテナンスについて記載されてます。
利用している場合には、メンテナンスを実施しておきましょう。