Oracle Database 20c のマニュアルが公開され、Oracle Cloud ではPreview 版を利用できるようになりました。Oracle Database 20c では遂にマルチテナント構成(CDB / PDB 構成)が必須になりました。Oracle Database 20c Upgrade Guide には以下の記述があります。
9 Behavior Changes, Deprecated and Desupported Features for Oracle Database
Desupport of Non-CDB Oracle Databases
Starting with Oracle Database 20c, installation of non-CDB Oracle Database architecture is no longer supported.
The non-CDB architecture was deprecated in Oracle Database 12c. It is desupported in Oracle Database 20c. Oracle Universal Installer can no longer be used to create non-CDB Oracle Database instances.
このためあらためてマルチテナント構成を復習することにしました。
マルチテナント構成ではデータベースを Container Database (CDB) と Pluggable Database (PDB) に分割して構成します。従来のデータベースに相当する部分を CDB と呼びます。一方でアプリケーションが接続して使用するデータベースが PDB です。PDB は CDB 内に複数作成されますが、相互に参照や更新はできず、アプリケーションにとっては独立したデータベースに見えます。PDB は従来のデータベースとほぼ同じ環境が提供されていますが、異なる部分もあります。
・制御ファイルや REDO ログファイルは、CDB が管理します。
・PROFILE, USER, ROLE などは PDB 単位に管理できます。
・初期化パラメーターは PDB では変更できないものがあります。PDB の初期化パラメーターは OS 上のファイルには出力されません。
・表領域は PDB 単位に作成されます。UNDO 表領域は PDB 単位/ CDB 単位を選択できます。
・CDB と PDB では表領域のデータファイルは共有しません。
・PDB 作成時に PDB 管理者名を決めますが、ユーザー名は任意です。
CDB を作る
マルチテナント環境の使用はデータベース作成時に決定され、後から変更できません。
Database Configuration Assistant (DBCA) を使ってデータベースを作成する場合には下記の画面で設定します。

「コンテナ・データベースとして作成」をチェックするとマルチテナント構成のデータベース(CDB)が作成されます。同時に PDB も作成することができますが、PDBは後から作成/削除できます。
DBCA から生成されるデータベース作成時に実行される CREATE DATABASE 文は以下の通りです(各種設定はデフォルト)。
CREATE DATABASE "O19D"
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 1024
DATAFILE SIZE 700M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE SIZE 550M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE SIZE 200M AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 SIZE 200M,
GROUP 2 SIZE 200M,
GROUP 3 SIZE 200M
USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM IDENTIFIED BY "&&systemPassword"
enable pluggable database LOCAL UNDO ON;
最後の行にある「enable pluggable database」がマルチテナント構成を有効にする宣言です。そのあとにある「LOCAL UNDO ON」は、DBCA で「PDB用のローカルUNDO表領域の使用(L)」をチェックした場合に指定されます。
PDB を作る
従来と同様に CDB の管理者は SYS で、管理者権限で接続するには「AS SYSDBA」宣言が必要です。PDB を作成するには CREATE PLUGGABLE DATABASE 文を実行します。もっとも簡単な方法は PDB$SEED と呼ばれるテンプレートから作成する方法です。CREATE PLUGGABLE DATABASE システム権限を持つユーザーであれば SYS/SYSTEM ユーザー以外でも PDB を作成できます。
SQL> CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdbadmin IDENTIFIED BY {password} ;
プラガブル・データベースが作成されました。
pdb3 は PDB の名前です。pdbadmin は PDB 自身の管理者ユーザー名です。このユーザーは CDB には作成されません。
CDB のデータファイルが OS 標準のファイルシステム上に作成されている場合やASM を使っていない場合は、CREATE PLUGGABLE DATABASE 文にFILE_NAME_CONVERT オプションの指定が必要になる場合があります。このパラメーターは、PDB が使用する表領域のデータファイルのパスを決定する際に使われます。
SQL> CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdbadmin IDENTIFIED BY {password};
CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdbadmin IDENTIFIED BY {password}
*
行1でエラーが発生しました。:
ORA-65016: FILE_NAME_CONVERTを指定する必要があります
SQL> CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdbadmin IDENTIFIED BY {password}
FILE_NAME_CONVERT=('O19D', 'PDB3');
プラガブル・データベースが作成されました。
PDB 管理者ユーザー名は DBCA を使ってあらかじめ PDB を作成した場合にはPDBADMIN が指定されますが、別の名前でも構いません。ただし SYS や SYSTEM は使うことができません。
PDB のデータファイル
PLUGGABLE DATABASE を作成すると、SYSTEM/SYSAUX 等の表領域とデータファイルが別途作成されます。これら PDB 用のデータファイルは、CDB の DBA_DATA_FILES ビューには現れません。PDB に接続して DBA_DATA_FILES ビューを参照するか、CDB_DATA_FILES / CDB_TEMP_FILES ビューを参照します。これらのビューにはCON_ID 列が存在し、どの PDB かを識別することができます。PDB の状態が OPEN 状態の場合のみ出力されます(後述)。
SQL> SELECT TABLESPACE_NAME, FILE_NAME FROM CDB_DATA_FILES WHERE CON_ID=4;
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------------------------------------
SYSTEM +DATA1/O19C/9EFAF87C09DA3F6FE0559213D55B30AE/DATAFILE/system.324.1032822137
SYSAUX +DATA1/O19C/9EFAF87C09DA3F6FE0559213D55B30AE/DATAFILE/sysaux.323.1032822137
UNDOTBS1 +DATA1/O19C/9EFAF87C09DA3F6FE0559213D55B30AE/DATAFILE/undotbs1.325.1032822137
SQL> SELECT TABLESPACE_NAME, FILE_NAME FROM CDB_TEMP_FILES WHERE CON_ID=4;
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------------------------------------
TEMP +DATA1/O19C/9EFAF87C09DA3F6FE0559213D55B30AE/TEMPFILE/temp.322.1032822141
ファイル名のパスには V$PDBS ビューの GUID が付与されています。これは PDB 作成時に FILE_NAME_CONVERT を指定しなかった場合です。
PDB の状態
作成した直後の PDB は MOUNTED 状態で、管理者以外は接続できません。一般ユーザーに接続を許可するには PDB を OPEN 状態に移行する必要があります。ALTER PLUGGABLE DATABASE 文を実行します。下記の例では PDB3 を OPEN 状態に移行しています。V$PDBSビューの OPEN_MODE 列が READ WRITE に変化しています。
SQL> SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
2 PDB$SEED READ ONLY
3 PDB1 MOUNTED
4 PDB3 MOUNTED
5 PDB2 MOUNTED
SQL> ALTER PLUGGABLE DATABASE pdb3 OPEN;
プラガブル・データベースが変更されました。
SQL> SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
2 PDB$SEED READ ONLY
3 PDB1 MOUNTED
4 PDB3 READ WRITE
5 PDB2 MOUNTED
インスタンスが再起動すると、PDB の状態は MOUNTED 状態に戻ります。インスタンス起動時に停止時の状態を維持するには、ALTER PLUGGABLE DATABASE SAVE STATE 文を実行します。元に戻す場合は ALTER PLUGGABLE DATABASE DISCARD STATE 文を実行します。
SQL> ALTER PLUGGABLE DATABASE pdb3 SAVE STATE;
プラガブル・データベースが変更されました。
SQL> SELECT CON_NAME, STATE FROM DBA_PDB_SAVED_STATES;
CON_NAME STATE
------------------------------ --------------
PDB3 OPEN
SQL> ALTER PLUGGABLE DATABASE pdb3 DISCARD STATE;
プラガブル・データベースが変更されました。
SQL> SELECT CON_NAME, STATE FROM DBA_PDB_SAVED_STATES;
レコードが選択されませんでした。