[アップデート] Amazon RDS for Oracle で非CDBインスタンスを CDB へ変換出来るようになりました

2023.06.03

いわさです。

Oracle Database では Oracle 12c 以降からマルチテナントアーキテクチャーであるコンテナデータベース(CDB)が導入されています。
それに伴って、非CDB は Oracle 12c で非推奨になり、さらに Oracle 20c ではサポートが終了し作成できなくなりました。

そんな Oracle の CDB ですが、Amazon RDS for Oracle でも次の記事で解説されているようにサポートされています。

RDS for Oracle 最新のメジャーバージョンである Oracle 21c では CDB インスタンスのみ作成が可能です。

Oracle 19c については非CDB と CDB どちらでインスタンスを作成するか、インスタンス作成時に選択することが出来ましたが、変更は出来ませんでした。 これは、公式ドキュメントにも次のように記述されていました。

アーキテクチャは永続的な特性であり、後で変更することはできません。

そのため、これまでは非CDB な RDS for Oracle 19c インスタンスを 21c にアップグレードすることが出来ませんでした。
しかし、本日のアップデートで非CDB として作成された RDS for Oracle インスタンスを CDB に変更出来るようになりました。

これによって、RDS for Oracle でも 21c へ移行出来るパスが用意されたことになります。
本日は実際に 非CDB を CDB に変更してみましたので手順やその様子などを紹介します。

非CDB インスタンスを作成

まずは RDS for Oracle の非CDB インスタンスを作成しましょう。
データベースエンジンで Oracle を選択すると次のようにチェックボックスから CDB として作成するかどうか選択することが出来ます。

ここでマルチテナントアーキテクチャにチェックをしない場合、つまり非CDB インスタンスの場合は選択出来るエンジンに 21c が表示されなくなります。

ちなみに、CDB として作成しようとした場合は、次のように 21c も選択が可能です。

ここでは非CDB の 19c インスタンスを作成しました。
エディションは Standard Edition の License Included で作成していますが、BYOL や Enterprise Edition でも同じようにサポートされているとのこと。

続いて SQL*Plus から接続して適当なテーブルとレコードを作成しました。

% sqlplus 'admin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= hoge0603oracle.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=hogedb)))'

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jun 3 12:49:50 2023
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password: 
Last Successful login time: Sat Jun 03 2023 12:48:51 +09:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> CREATE TABLE test (hoge_id VARCHAR2(2) NOT NULL,hoge_name VARCHAR2(50));
Table created.

SQL> INSERT INTO test (hoge_id, hoge_name) VALUES ('1', 'aaa');
1 row created.

SQL> INSERT INTO test (hoge_id, hoge_name) VALUES ('2', 'bbb');
1 row created.

SQL> INSERT INTO test (hoge_id, hoge_name) VALUES ('3', 'ccc');
1 row created.

SQL> select * from test;

HO HOGE_NAME
-- --------------------------------------------------
1  aaa
2  bbb
3  ccc

CDB への変更

作成した非CDB インスタンスを CDB へ変更しましょう。
インプレースでアップグレードされるのでエンドポイントは変更されませんが、CDB から非CDB へ逆方向の変更は出来ないので、その点はご注意ください。

手順自体は簡単で、インスタンス変更から CDB にチェックを入れて更新するだけです。

また、CDB への変更とバージョンアップ(例えば 19c から 21c へのアップグレード)は出来ません。一度 CDB に変換した後に 21c へのメジャーバージョンアップ操作が必要です。

ただし、公式ドキュメントにはいくつか制限事項が記載されていますので事前にこちらに該当するか確認しておきましょう。
例えば、Oracle Data Guard が有効になっている場合は今回の機能を使うことが出来ません。

変更のためにダウンタイムが発生します。
今回検証した最低限のテーブルとインスタンスサイズ(db.t3.small)だと、1 時間弱かかりました。

CDB への移行後の様子

次のように CDB に変更されていることが確認出来ます。

SQL*Plus から接続してみると先程と同じようにテーブルにアクセスすることが出来ます。
※ ここではレコードを確認していないのですがコミット忘れでレコードの作成が確定されてませんでした。

% sqlplus 'admin@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= hoge0603oracle.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=hogedb)))'

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jun 3 15:50:45 2023
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password: 
Last Successful login time: Sat Jun 03 2023 15:49:21 +09:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
TEST

また、インスタンスの変更から変更後バージョンに 21c も選択出来るようになりました。

さいごに

本日は Amazon RDS for Oracle で非CDB インスタンスを CDB へ変換出来るようになったので実際に試してみました。

非CDB の 19c から 21c にアップグレードしたかった方には朗報ではないでしょうか。
ただし、インプレースでの長めのダウンタイムが発生したり、CDB から非CDB の逆方向の戻しは出来ませんので事前に本番環境以外で試してください。
CDB の PDB は非CDB インスタンスと互換性が保証されていますが、接続クライアントの接続方法によって接続出来なくて変更が必要な場合があるので、そのあたりも事前に確認しておいたほうが良いですね。