RDS for Oracleのマルチテナント構成を試してみた

# はじめに

2023/11/9 に Amazon RDS for Oracleでマルチテナント構成のサポートが発表されました。

- [Amazon RDS for Oracle now supports Oracle Multitenant](https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-rds-oracle-supports-oracle-multitenant/)

RDS for Oracleでは以前(2021/5)より [マルチテナントアーキテクチャを利用した単一のプラガブルデータベース構成](https://aws.amazon.com/jp/about-aws/whats-new/2021/05/amazon-rds-oracle-supports-multitenant-container-database/) はサポートされていましたが、文字通りのマルチテナント構成は今回のアップデートで初めて利用できるようになりました。マルチテナントアーキテクチャにおける単一のプラガブルデータベース構成自体はあまり意味がある構成ではなかったため、今回のアップデートで本格的にマルチテナントの恩恵を受けることができるようになると考えてます。

以下で、マルチテナント構成を実際に試して、何ができるようになったか、また、何ができないのかを確認していきます。

# マルチテナント構成を作成してみる

RDSの作成において、Oracle Databaseを選択すると、以下のようなアーキテクチャ設定において、シングルテナントかマルチテナントを選択することができます。記載あるように、シングルテナントからマルチテナントへの変更は可能ですが、マルチテナントからシングルテナントへの変更はNGになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/069e189c-cbf8-ac4b-6a64-104b9ef61a25.png)

マルチテナント設定をすると、テナント側のデータベースの設定(PDB：プラガブルDB)の名前、マスタユーザ・パス、文字セットを選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/fb5f9cd8-5de2-8cad-e2e7-fcb91ce599ef.png)

データベースを作成すると、以下のようにインスタンスとテナントデータベースが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/2fae69ed-977f-0dad-3cd1-06e6f062aa84.png)

# マルチテナント構成のデータベースの確認

作成されたデータベースを確認すると、以下のように「テナントデータベース」のタブが新しくできていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/c210fcd5-ff90-8c4b-64d0-69921bcd6187.png)

テナントデータベースでは以下のように インスタンスデータベース や テナントデータベース が確認できます。Oracle Databaseの正式な名称では、インスタンスデータベース は コンテナデータベース(CDB)、テナントデータベース は プラガブルデータベース(PDB) になります。今回は以下のような形ですね。

- インスタンスデータベース：CDB
    - mtestdb1
- テナントデータベース：PDB
    - PDB01

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/ded919b7-b38c-4407-fae0-8185b4fc6659.png)

テナントデータベース（PDB）に対してのアクションは現時点では名称の変更とマスターユーザのパスワード変更、そして削除のみが許可されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/d862aa00-ae36-78dc-3e58-4d36607f6d9a.png)

削除については、一つしかテナントデータベース（PDB）がない場合には以下のようなエラーが出て削除できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/91483e63-c11d-36d7-71a2-5e29f28e7415.png)

# テナントデータベース（PDB）の追加

インスタンスデータベース（CDB）のアクションを確認すると、以下のようにテナントデータベース（PDB）を追加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/82e7f744-75b5-e9da-14ea-6263a4aa7975.png)

初期作成時と同様に、テナントデータベース（PDB）の名称、マスターユーザー名・パス、データベース文字セットを設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/a2c30778-b03d-191e-3c95-b55288912b24.png)

作成すると、以下のような状態になります。既存のテナントデータベース（PDB）は利用可能な状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/4365f11d-d8ea-a117-db32-18cd02bdccb5.png)

ここで、アラートログを確認すると、以下のような形で作成されていることがわかります。
```SQL:
CREATE PLUGGABLE DATABASE PDB02 AS CLONE USING '/rdsdbdata/tmp/tdbtemplates/pdbtemplate/pdbtemplate.19.0.0.0.base.pdb'
```

作成が完了すると、以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/f2ff4d38-f17b-ca0c-431b-57447d306fd2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/2a0c2324-453b-d94f-10ec-d33317b7a8c7.png)

# テナントデータベース（PDB）の管理

マルチテナント構成のOracle Databaseは、通常は各テナントデータベース（PDB）の停止や切り離し（Unplug）、追加（Plug）やリソースケージング（PDB毎のリソース制限）、PDB毎のリソース監視、PDB毎のPITR(Point In Time Recovery)を行うことができます。
RDS for Oracleの場合、インスタンス（CDB）にアクセスできず、また、GUI上のアクションで該当のコマンドが現時点(2023/11/11)では提供されていないため、各テナントデータベース（PDB）の管理は行えません。

# まとめ

今までのRDS for Oracleではマルチテナントアーキテクチャを用いてはいましたが、シングルテナントのみしか利用できず、マルチテナントアーキテクチャのメリットを活用できていませんでした。
今回、テナントデータベース（PDB）を複数利用できるようになったため、マルチテナントの恩恵であるデータベースレベルでの分離を行うことができるようになりました。
ただ、現時点ではテナントデータベース（PDB）個別の管理がほぼできないため、活用するユースケースは絞られると考えています。しかしながら、今後拡張されていることは想像に難くないため、今のうちからマルチテナントアーキテクチャが利用できるようになったときにどのように自社のシステムに適用できるか、考えておくとよいと思います。

また、RDS Custom for Oracleではすでにマルチテナント構成がサポートされています。

- [Amazon RDS Custom for Oracle が Oracle Multitenant をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-rds-custom-oracle-supports-oracle-multitenant/)