OracleプラグインデータベースのAmazon RDS for Oracleへの移行

# はじめに
2/16のAWS blogにて [Migrate your Oracle pluggable database to Amazon RDS for Oracle](https://aws.amazon.com/jp/blogs/database/migrate-your-oracle-pluggable-database-to-amazon-rds-for-oracle/) が発表されました。
RDS for Oracleも[マルチテナント構成(※)がサポート](https://dev.classmethod.jp/articles/rds-for-oracle-supports-multitenant-cootainer-db/)されたのは最近だったので、ついに 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月に [マルチテナント構成がサポート](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-custom-oracle-supports-oracle-multitenant/)されたため、Unplug & Plugでの移行が可能になると思われます。

# RDS for Oracleへの移行

#### 構成の概要

ソースのマルチテナントのデータベースからターゲットとなるRDS for Oracleへデータインポートを行います。
今回は以下のような構成で実施しました。

- ソース：21c XE (XEPDB1)
- ターゲット：19c SE2 (TESTDB02)
なお、RDS for Oracleをマルチテナント構成で作成すると、CDBは固定で RDSCDB となります。また、CDBへのアクセス方法が提供されていないため、特に意識する必要はないと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/e62b25a9-c04c-c4d8-809f-24c67459f875.png)

#### 前提条件

元の [blog](https://aws.amazon.com/jp/blogs/database/migrate-your-oracle-pluggable-database-to-amazon-rds-for-oracle/) にはいろいろと前提が書いてありますが、結局expdp/impdpで移行するのであまり意識する必要はないと思います。

#### ソース Oracle データベースからデータをエクスポートする

ソースの21c XEPDB1 に接続して、スキーマを確認します。
```SQL: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を指定しておきます。
```shell-session:スキーマのエクスポート
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) 統合を試してみた](https://qiita.com/asahide/items/93c63159f2aea73eb2a3) を参照ください。

ターゲットとなるRDS側の情報を確認します、CDBはRDSCDBとなっていることが確認できます。
また、PDB側にユーザスキーマがないことも確認できます。
```SQL:RDSの事前確認
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
```

ソースデータからエクスポートしたデータを、ターゲットにインポートします。
```shell-session:スキーマのインポート
$ 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:インポート後の確認
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ではインポート後にトリガやシーケンスのメンテナンスについて記載されてます。
利用している場合には、メンテナンスを実施しておきましょう。