CDBおよびPDB

マルチテナント・アーキテクチャにより、Oracleデータベースはマルチテナント・コンテナ・データベース(CDB)として機能できます。

Oracle Database 21c以降では、マルチテナント・コンテナ・データベースがサポート対象の唯一のアーキテクチャになっています。以前のリリースでは、Oracleは非コンテナ・データベース(非CDB)をサポートしています。

CDBのコンテナについて

コンテナとは、マルチテナント・コンテナ・データベース(CDB)内のスキーマ、オブジェクトおよび関連構造の集合のことです。CDB内では、各コンテナは一意のIDと名前を持ちます。

CDBには、顧客が作成した0個以上のプラガブル・データベース(PDB)およびアプリケーション・コンテナが含まれています。PDBは、Oracle Netクライアントに個別のデータベースとして表示されるスキーマ、スキーマ・オブジェクトおよび非スキーマ・オブジェクトをポータブル・コレクションしたものです。アプリケーション・コンテナはオプションのユーザー作成CDBコンポーネントです。このコンポーネントには、1つ以上のアプリケーション・バックエンドのデータおよびメタデータが格納されます。CDBにはゼロ以上のアプリケーション・コンテナが含まれます。

ノート: 「アプリケーション・コンテナ」では、アプリケーション・コンテナについて詳しく説明します。

次の図は、CDBで使用可能なコンテナを示しています。

図1: CDBのコンテナ

画像admin112.pngの説明

CDBごとに、次のコンテナがあります。

例2-1 アプリケーション・コンテナを使用しないCDB

この例は、システム・コンテナ(CDB全体)、CDBルート、PDBシード(PDB$SEED)および2つのPDBという5つのコンテナがあるシンプルなCDBを示しています。各PDBには、独自の専用アプリケーションが存在します。異なるPDB管理者が各PDBを管理します。共通ユーザーは、単一のIDを持つCDB全体で1つのIDを持ちます。この例では、共有ユーザーSYSは、ルートおよびすべてのPDBを管理できます。物理レベルでは、このCDBは1つ以上のデータベース・インスタンスによって管理され、各PDBおよびCDB自体の一連のデータ・ファイルが含まれています。

図2: アプリケーション・コンテナを使用しないCDB

画像cncpt345.pngの説明

例2-2 アプリケーション・コンテナを使用するCDB

この例では、CDBにsaas_sales_acというアプリケーション・コンテナが含まれます。アプリケーション・コンテナ内で、アプリケーションPDBのcust1_pdbは1人の顧客のアプリケーションをサポートし、アプリケーションPDBのcust2_pdbは別の顧客のアプリケーションをサポートします。CDBにはhrpdbというPDBも含まれており、これはHRアプリケーションをサポートしますが、アプリケーション・コンテナには属していません。

図3: アプリケーション・コンテナを使用するCDB

画像cncpt383.pngの説明

この例では、複数のDBAがCDB環境を管理します。

CDBルートとシステム・コンテナ

CDBルートは、スキーマ、スキーマ・オブジェクトおよび非スキーマ・オブジェクトの集合であり、すべてのPDBはこれに属します。

どのCDBにも、CDB$ROOTという名前のルート・コンテナが1つだけあります。ルートにはPDBの管理に必要なシステム・メタデータが格納されます。すべてのPDBはこのルートに属します。システム・コンテナはCDBルートであり、このルートに属するすべてのPDBになります。

CDBルートにはユーザー・データは格納されません。Oracleでは、共通オブジェクトをルートに追加したり、ルート内のOracle提供スキーマを変更することはないかもしれません。 ただし、データベース管理用の共通ユーザーおよびロールを作成できます。必要な権限を持った共通ユーザーは、コンテナ間の切替えが可能です。

Oracleでは、ルート文字セットにAL32UTF8を推奨しています。文字セット変換をしなくても、異なる文字セットを使用するPDBが同じCDB内に存在できます。

例2-3 CDBのすべての コンテナ

CDBルートに接続された管理ユーザーによって発行される次の問合せによって、CDB内のすべてのコンテナ(シードおよびCDBルートを含む)がCON_IDの順序でリストされます。

COL NAME FORMAT A15
SELECT NAME, CON_ID, DBID, CON_UID, GUID
FROM   V$CONTAINERS ORDER BY CON_ID;

NAME          CON_ID       DBID    CON_UID GUID
------------- ------ ---------- ---------- --------------------------------
CDB$ROOT           1 1895287725          1 2003321EDD4F60D6E0534E40E40A41C5
PDB$SEED           2 2795386505 2795386505 200AC90679F07B55E05396C0E40A23FE
SAAS_SALES_AC      3 1239646423 1239646423 200B4CE0A8DC1D24E05396C0E40AF8EE
SALESPDB           4 3692549634 3692549634 200B4928319C1BCCE05396C0E40A2432
HRPDB              5 3784483090 3784483090 200B4928319D1BCCE05396C0E40A2432

関連項目: 「共通ユーザー・アカウント」

PDB

PDBは、ユーザーが作成したスキーマ、オブジェクトおよび関連構造体のセット、論理的にクライアント・アプリケーションでは個別のデータベースとして表示されます。

あらゆるPDBは、PDBを作成したユーザーに関係なくSYSによって所有されます。SYSはCDBの共通ユーザーです。これは、ルートおよびCDB内のすべての既存および将来のすべてのPDBで同じIDを持つこのユーザーを意味します。

PDBのタイプ

すべてのPDBは、Oracle提供のPDB$SEEDを除いて、CREATE PLUGGABLE DATABASE文でユーザー作成されます。

次のタイプのPDBを作成できます。

標準PDB

このタイプのPDBは、シード、プロキシCDBまたはアプリケーション・ルートとしてPDBを指定せずに、CREATE PLUGGABLE DATABASEを実行することによって生成されますその機能は作成する対象のコンテナによって異なります。

アプリケーション・ルート

アプリケーション・ルートは、アプリケーション固有のルート・コンテナとみなされます。アプリケーション・バックエンドのマスター定義(共通データとメタデータを含む)用のリポジトリとして機能します。アプリケーション・ルートを作成するには、CDBルートに接続し、CREATE PLUGGABLE DATABASE文にAS APPLICATION CONTAINER句を指定します。「アプリケーション・ルート」を参照してください。

PDBのシード

標準PDBとは異なり、シードPDBはアプリケーションのサポートを目的としていません。むしろ、シードはアプリケーションをサポートするPDBを作成するためのテンプレートです。シードは次のいずれかです。

プロキシPDB

プロキシPDBは、データベース・リンクを使用してリモートCDB内のPDBを参照するPDBです。PDBが開いている間にプロキシPDBで文を発行すると、その文は参照先PDB内で実行されます。

プロキシPDBは、CDBルートまたはアプリケーション・ルートへの接続中に作成する必要があります。プロキシPDBは、標準PDBと同じように変更または削除ができます。

PDBの目的

アプリケーションの場合、PDBは、自己完結型の、完全に機能したOracleデータベースになります。PDBを1つのCDBに統合することで、PDBの分離を維持しながら規模の経済性が得られます。

PDBを使用して、次の特定の目的を達成できます。

関連情報:

プロキシPDB

プロキシPDBは、参照先PDBと呼ばれるリモートPDBを参照します。

プロキシ(参照元)PDBでSQL文を発行する場合でも、その文は参照先PDB内で実行されます。この点において、プロキシPDBはLinuxのシンボリック・リンク・ファイルと大まかに似ています。

プロキシPDBには、次の利点があります。

プロキシPDBを作成するには、AS PROXY FROM句を含むCREATE PLUGGABLE DATABASEを実行します(FROMは参照先PDB名およびデータベース・リンクを指定します)。作成文では、SYSTEMおよびSYSAUX表領域に属すデータ・ファイルのみがコピーされます。

例2-4 プロキシPDBの作成

この例ではローカル本番CDBのコンテナsaas_sales_acに接続します。sales_admin共通ユーザーは、sales_sync_pdbというプロキシPDBを作成します。このアプリケーションPDBは、cdb_dev_remデータベース・リンクを使用してアクセスするリモート開発CDBの、saas_sales_test_acというアプリケーション・ルートを参照します。本番CDBのsaas_sales_acでアプリケーションのアップグレードが発生すると、リモート開発CDBのアプリケーション・ルートsaas_sales_test_acにアップグレードが自動的に伝播されます。

CONNECT sales_admin@saas_sales_ac
Password: ***********

CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROM saas_sales_test_ac@cdb_dev_rem;

PDBの名前

CDB内のコンテナは同じネームスペースを共有します。つまり、このネームスペース内では一意の名前を保持する必要があります。

次のコンテナの名前は同じCDB内で競合しないことが必要です。

たとえば、同じCDBにアプリケーション・コンテナsaas_sales_acとsaas_sales_test_acが含まれる場合、両方ともcust1と名付けられた2つのアプリケーションPDBが両方のコンテナに同時に存在することはできません。このネームスペース・ルールではCDBルートでのcust1pdbというPDBの作成と、アプリケーション・ルートでのcust1pdbというPDBの作成も妨げられます。

PDBおよびアプリケーション・ルート・コンテナの名前は、ネット・サービス名と同じルールに従う必要があります。さらに、PDBまたはアプリケーション・ルートは独自の名前のサービスを持つため、コンテナ名は、特定のリスナーを介して公開されるサービスを所有するすべてのCDBにわたって一意にする必要があります。ユーザー作成のコンテナ名の最初の文字は英数字にし、それ以降の文字を英数字またはアンダースコア(_)にする必要があります。サービス名には大文字小文字の区別がないため、コンテナ名にも大文字と小文字の区別はなく、区切り識別子を使用して指定しても、大文字になります。

関連項目:サービス名のルールについては、『Oracle AI Database Net Servicesリファレンス』を参照してください

PDB間のデータベース・リンク

デフォルトで、あるPDBに接続しているユーザーが、別のPDBのオブジェクトにアクセスするには、データベース・リンクを使用する必要があります。

図4: PDB間のデータベース・リンク

画像cncpt384.pngの説明

このルールには、次の例外があります。

プロキシPDBを作成するとき、CREATE PLUGGABLE DATABASE ... AS PROXY文のFROM句でデータベース・リンク名を指定する必要があります。プロキシPDBと参照先PDBが別々のCDBに存在する場合は、プロキシPDBが含まれるCDBのルート内でデータベース・リンクが定義されている必要があります。データベース・リンクは、リモート参照先PDB、またはリモートCDBのCDBルートのいずれかに接続する必要があります。

参照: 「共通オブジェクトとローカル・オブジェクト」