7 PDBまたは非CDBのクローニング

ローカルPDB、リモートPDBまたは非CDBをクローニングすることで、PDBを作成できます。

この章のトピックは、次のとおりです:

PDBのクローニングについて

ソースPDBまたは非CDBからPDBをクローニングするには、CREATE PLUGGABLE DATABASE文を使用します。

この手法では、ソースPDBまたは非CDBを新しいPDBとしてクローニングし、そのクローンをCDBに自動的に接続します。この手法を使用するには、ソースを指定するFROM句を含める必要があります。ソースは、クローニングする既存のPDBまたは非CDBです。ターゲットPDBはソースのクローンです。ソースは次のいずれかです。

  • ローカルPDB

  • リモートCDB内のPDB

  • 非CDB

CREATE PLUGGABLE DATABASE文では、ソースに関連付けられているファイルを新しい場所にコピーし、そのファイルをターゲットPDBに関連付けます。CDBがARCHIVELOGモードおよびローカルUNDOモードの場合、ソースPDBは読取り/書込みモードでオープンでき、クローニング・プロセス中に機能します。この手法は、ホット・クローニングと呼ばれます。

ノート:

PDBをクローニングするときに、ソース・データベースに暗号化されたデータまたはキーストア・セットがある場合、CREATE PLUGGABLE DATABASE ... FROM SQL文のkeystore_password句によって識別されるキーストアを含めることによって、キーストアのパスワードを提供する必要があります。このパスワードは、ソース・データベースが自動ログイン・ソフトウェア・キーストアを使用している場合であっても指定する必要があります。ソース・データベースに暗号化データまたはキーストアがあるかどうかを判別するには、DBA_ENCRYPTED_COLUMNSデータ・ディクショナリ・ビューに問い合せます。

クローニングの一般的な用途は、テストPDBの作成です。クローニングを使用すると、PDBまたは非CDBのクローンを1つ以上作成し、孤立した状況で安全にテストできます。たとえば、新しいアプリケーションまたは変更されたアプリケーションを、本番PDBで使用する前に、クローニングPDBでテストできます。

この項では、次の項目について説明します。

関連項目:

暗号化データまたはキーストア・セットを持つソースのクローニングについて学習するには、『Oracle Database Advanced Securityガイド』を参照してください

ローカルPDBのクローニングについて

クローニングの最も簡単な形式では、PDBをCDBから同じCDBにコピーします。

ノート:

PDBをPDBシード(PDB$SEED)またはアプリケーション・シードから作成する場合に、CREATE PLUGGABLE DATABASE文にFROM句を含めることはできません。

次の図は、ローカルPDBをクローニングする方法を示しています。

図7-1 ローカルPDBのクローニング

図7-1の説明が続きます
「図7-1 ローカルPDBのクローニング」の説明

PDBをクローニングする前に、「表5-3」のPDBのクローニングに適用される質問に対処します。この表では、様々な要因に基づいて指定するCREATE PLUGGABLE DATABASEの句について説明しています。

Oracle Database 18c以降では、DBCAを使用してローカルPDBをクローニングできます。

リモートPDBのクローニングについて

ソースがリモートCDB内のPDBである場合は、データベース・リンクを使用してPDBをローカルCDBにクローニングする必要があります。

データベース・リンクは、ローカルCDB (リモートCDBではない)に存在している必要があります。ローカルCDBのルートからCREATE PLUGGABLE DATABASE文を発行する場合は、クローニングされるPDBを含むリモートCDBへのデータベース・リンクをFROM句で指定する必要があります。データベース・リンクは、ローカルCDBから、リモートCDBのルートまたはリモート・ソースPDBのいずれかに接続します。

次の図は、ソースPDBがリモートである場合に、この手法で新規PDBがどのように作成されるかを示しています。

図7-2 リモートPDBのクローニングによるPDBの作成

図7-2の説明が続きます
「図7-2 リモートPDBのクローニングによるPDBの作成」の説明

非CDBのクローニングについて

ソースが非CDBである場合は、非CDBへのデータベース・リンクをFROM句で指定する必要があります。

次の図は、ソースがリモート非CDBである場合に、この手法で新しいPDBがどのように作成されるかを示しています。

図7-3 非CDBのクローニングによるPDBの作成

図7-3の説明が続きます
「図7-3 非CDBのクローニングによるPDBの作成」の説明

アプリケーションPDBのクローニングについて

すべてのクローニングの使用例で、CREATE PLUGGABLE DATABASE文をアプリケーション・ルートで実行する場合、クローニングされたPDBはアプリケーション・コンテナ内に作成されます。

ソースPDBのアプリケーション名およびバージョンは、アプリケーション・コンテナのアプリケーション名およびバージョンと一致する必要があります。

次の図に、この手法でローカル・ソース・アプリケーションPDBをクローニングすることで新しいアプリケーションPDBをアプリケーション・コンテナに作成する方法を示します。ソースPDBは、ローカルCDBルートに接続されたPDB、リモートCDBルートに接続されたPDBまたはリモート・アプリケーション・ルートに接続されたアプリケーションPDBにすることができます。

図7-4 アプリケーション・コンテナ内のPDBのクローニング

図7-4の説明が続きます
「図7-4 アプリケーション・コンテナ内のPDBのクローニング」の説明

関連項目:

「PDB記憶域」

リフレッシュ可能なクローンPDBについて

CREATE PLUGGABLE DATABASE ... REFRESH MODE文は、ソースPDBをクローニングし、クローンをリフレッシュ可能に構成します。クローンPDBをリフレッシュすると、最後のREDOログの適用以降に蓄積されたREDOでクローンPDBが更新されます。

この項では、次の項目について説明します。

リフレッシュ可能なクローンPDBの目的

本番PDBのクローニング操作は時間がかかる場合があります。

システム上でのドラッグを回避するためにPDBを頻繁にクローニングしないと、クローン・データは古くなります。リフレッシュ可能なクローンPDBによってこの問題が解決します。リフレッシュ可能なクローンが古い場合は、最新のREDOを使用して迅速にリフレッシュできます。本番PDBの「最終マスター」のリフレッシュ可能なクローンを保持し、開発およびテスト用に「最終マスター」のスナップショット・クローンを取得するのが一般的な方法です。

ALTER PLUGGABLE DATABASE ... SWITCHOVER文を使用して、ソースとクローンPDBのロールを置き換えることができます。この機能は、次の場合に有効です。

  • 計画済スイッチオーバー

    ソースPDBをホストするCDBは、クローンPDBをホストするCDBよりもオーバーヘッドが非常に多くなる可能性があります。ロード・バランシングをアーカイブするには、ロールを置き換えて、クローンを新しいソースPDBにし、ソースPDBを新しいクローンにできます。

  • 計画外スイッチオーバー

    ソースPDBで不測の失敗が発生することがあります。この場合、クローンPDBを新しいソースPDBにして、通常の操作を再開できます。

関連項目:

自動および手動リフレッシュ・モード

設定した間隔で自動的にリフレッシュするようにクローンPDBを構成するか、またはALTER PLUGGABLE DATABASE REFRESH文により手動でリフレッシュできます。

REFRESH MODE句は、CREATE PLUGGABLE DATABASE ... FROM文でのみサポートされています。この句を使用して、次のいずれかのオプションを指定できます。

  • デフォルトのREFRESH MODE NONEを指定して、リフレッシュ可能でないPDBを作成します。

    ALTER PLUGGABLE DATABASE文にREFRESH MODE NONE句を含め、PDBを読取り/書込みモードでオープンすることにより、リフレッシュ可能なクローンPDBを通常のPDBに変更できます。通常のPDBはリフレッシュ可能なクローンPDBに変更できません。リフレッシュ可能なクローンPDBが通常のPDBに変換された後は、リフレッシュ可能なクローンPDBに戻すことができません。

  • REFRESH MODE MANUALを指定して、手動でリフレッシュする必要のあるリフレッシュ可能PDBを作成します。

  • REFRESH MODE EVERY number_of_minutes MINUTESを指定して、指定した時間(分単位)の経過後に自動的にリフレッシュされるリフレッシュ可能PDBを作成します。自動リフレッシュを使用するリフレッシュ可能PDBを手動でリフレッシュすることもできます。

ノート:

  • リフレッシュ可能PDBを作成する場合、PDBにREMOTE_RECOVERY_FILE_DEST初期化パラメータを設定できます。この初期化パラメータは、ソースPDBがデータベース・リンク上で使用可能でない場合に、リフレッシュ操作中にアーカイブ・ログ・ファイルを読み取るディレクトリを指定します。

  • ソースPDBに新しいデータファイルが作成された場合は、CDBでPDB_FILE_NAME_CONVERT初期化パラメータを設定して、データファイルのパスをソースPDBからクローンPDBに変換する必要があります。

例7-1 自動リフレッシュを指定したREFRESH MODE句

このリフレッシュ・モード句では、リフレッシュ可能なPDBが2時間(120分)おきに自動的にリフレッシュされることを指定します。

REFRESH MODE EVERY 120 MINUTES
リフレッシュ可能なクローンPDBの要件

リフレッシュ可能なクローンPDBを作成するには、データベース・リンクが必要です。データベース・リンクは、同じCDBまたは別のCDBを指し示すことができます。

リフレッシュ可能なクローンPDBは、次のいずれかの状態である必要があります。

  • クローズ

    リフレッシュ可能PDBは、リフレッシュの実行時にクローズする必要があります。自動リフレッシュが試行されたときにクローズされていない場合、リフレッシュは次のスケジュール済リフレッシュまで延期されます。ユーザーが手動リフレッシュの実行を試行したときにクローズされていない場合は、エラーがレポートされます。

  • 読取り専用モードでオープン

    ソースPDBでは行われていない同期されていない変更がリフレッシュ可能なPDBで行われないように、リフレッシュ可能なPDBは読取り専用モードにしておく必要があります。リフレッシュ可能なPDBはクローン・マスターとして機能することが意図されているため、リフレッシュされた時点でソースPDBが正確に反映される必要があります。

PDBスナップショットからのPDBのクローニングについて

PDBスナップショットとは、PDBのデータベース管理Point-in-Timeコピーのことです。スナップショット・クローンPDBとは、スナップショットから作成されたPDBのことです。

Oracle Database 19c以降、PDBスナップショットの動作は、CLONEDB初期化パラメータの設定によって決まります。

  • CLONEDB=TRUE

    読取り/書込みモードまたは読取り専用モードのPDBのスナップショットを取得できます。最初のPDBのスナップショットには元のPDBファイルのフル・コピーが含まれていますが、同じPDBの後続のスナップショットにはスパース・ファイルが含まれます。

  • CLONEDB=FALSE

    読取り専用PDBのスナップショットのみを取得できます。すべてのスナップショットが、ソースPDBファイルのフル・コピーになります。この場合、PDBスナップショットに基づいてクローンPDBを作成すると、そのクローンPDBの存続期間中、ソースPDBは読取り専用のままにしておく必要があります。

ノート:

各種エディションおよびサービスでサポートされる機能の詳細は、『Oracle Databaseライセンス情報ユーザー・マニュアル』を参照してください

PDBスナップショット・カルーセル

PDBスナップショット・カルーセルは、最大8個のスナップショットのライブラリです。カルーセルによって、特定のSCNまたは時点にPDBの「ホット・クローン」を実行できます。ユースケースでは、カルーセルからスナップショット(通常は最新のスナップショット)をリストアし、必要なSCNまたはタイムスタンプにリカバリします。

PDBスナップショットからのPDBのクローニング

CREATE PLUGGABLE DATABASE文のUSING SNAPSHOT句は、既存のPDBスナップショットからアクティブなPDBを作成します。使用可能なPDBスナップショットを確認するには、DBA_PDB_SNAPSHOTSデータ・ディクショナリ・ビューを問い合せます。

スナップショットからPDBをクローニングするには、次のいずれかの値をUSING SNAPSHOT句で指定します。

  • PDBスナップショット名

  • 次の形式のPDBスナップショットのSCN

    USING SNAPSHOT AT SCN scn
  • 次の形式のPDBスナップショットのタイムスタンプ

    USING SNAPSHOT AT TIME timestamp

PDBスナップショットがスパース・コピーである場合(つまり、CLONEDB=TRUE時に作成されたものであり、ソースPDBの最初に取得されたスナップショットでない場合)、このスナップショットからクローニングされたPDBもスパースになります。

関連項目:

スナップショット・コピーPDBについて

スナップショット・コピーPDBは、CREATE PLUGGABLE DATABASE ... SNAPSHOT COPY文を使用して作成されたPDBです。

この項では、次の項目について説明します。

スナップショット・コピーPDBと標準クローンの違い

スナップショット・コピーPDBと、USING SNAPSHOT句を使用して作成されたPDBスナップショットは異なるタイプのスナップショットです。

スナップショット・コピーPDBには、ソース・データ・ファイルの完全なコピーは含まれていません。かわりに、基礎となるファイル・システムの記憶域レベルのスナップショットが作成され、そのスナップショットからクローンPDBが作成されます。

標準のクローンPDBとは異なり、スナップショット・コピーPDBは記憶域スナップショットに依存しています。そのため、このPDBはCDBルートから切断することも、アプリケーション・ルートに接続することもできません。また、そのPDBが基づいている記憶域スナップショットを削除することもできません。そのかわりに、スナップショット・コピーPDBをマテリアライズする必要があります。これにより、非スパース・ファイルによる完全PDBに変換します。

対照的に、USING SNAPSHOT句は、マテリアライズが不要なスタンドアロンのPDBを作成します。USING SNAPSHOT句とSNAPSHOT COPY句の両方を使用して、PDBスナップショットに基づくスナップショット・コピーPDBは作成できないことに注意してください。ただし、USING SNAPSHOTを使用してスタンドアロンのクローンPDBを作成し、そのスタンドアロンPDBからSNAPSHOT COPY PDBを作成できます。

スナップショットのコピーPDBの記憶域要件

CREATE PLUGGABLE DATABASE ... FROM sourcepdbSNAPSHOT COPY句を指定するときには、ソースPDBのすべてのデータファイルが同一の記憶域タイプで存在している必要があります。

記憶域要件は、CLONEDB初期化パラメータの設定によって異なります。

  • CLONEDB=FALSE

    ソースPDBファイルの基礎となるファイル・システムでは、記憶域スナップショットをサポートする必要があります。そのようなファイル・システムとして、Oracle Automatic Storage Management Cluster File System (Oracle ACFS)およびDirect NFS Client記憶域などがあります。Oracle Exadataは、スパースASMグリッド・ディスクを使用して構成されたASMでスナップショット・コピー機能をサポートします。

  • CLONEDB=TRUE

    ソースPDBファイルの基礎となるファイル・システムには、Direct NFSが有効化されていてスパース・ファイルをサポートしている任意のローカル・ファイル・システム、ネットワーク・ファイル・システム(NFS)またはクラスタ化ファイル・システムを使用できます。ほとんどのUNIXシステム(Oracle ACFSとZFSを含む)は、これらの要件を満たしています。ただし、CLONEDB=TRUEの場合、ソースPDBは、クローンが存在するときには読取り専用モードでオープンしたままにする必要があります。

Direct NFSクライアントにより、Oracle Databaseは、オペレーティング・システム・カーネルのNFSクライアントを使用するかわりに、ネットワーク接続記憶域(NAS)デバイスに直接アクセスできます。ソースPDBのファイルがDirect NFSクライアント記憶域に格納されている場合は、次の追加の要件が満たされている必要があります。

  • ソースPDBファイルはNFSボリューム上に存在する必要があります。

  • 記憶域の資格証明は、透過的データ暗号化キーストアに格納されている必要があります。

  • 記憶域ユーザーは、ソースPDBのファイルをホストするボリューム上でスナップショットを作成および破棄するために必要な権限を持っている必要があります。

  • 資格証明は、ADMINISTER KEY MANAGEMENT ADD SECRET SQL文を使用してキーストアに格納されている必要があります。

    次の例では、ソフトウェア・キーストアのOracle Databaseシークレットを構成しています。

    ADMINISTER KEY MANAGEMENT  
      ADD SECRET 'secret' FOR CLIENT 'client_name' 
      USING TAG 'storage_user' 
      IDENTIFIED BY  keystore_password  WITH BACKUP;
    

    構成内の各記憶域サーバーに対して個別のエントリを追加するには、この文を実行します。前の例では、次の値を指定する必要があります。

    • secretは、記憶域パスワードです。

    • client_nameは、記憶域サーバーです。LinuxまたはUNIXのプラットフォームでは、/etc/hostsに入力した名前または記憶域サーバーのIPアドレスです。

    • tagは、記憶域サーバーに渡されるユーザー名です。

    • keystore_passwordは、キーストアのパスワードです。

SNAPSHOT COPY句を使用して作成されたPDBクローンは、切断できません。削除のみ可能です。SNAPSHOT COPY句を使用して作成したクローンを切断しようとすると、エラーが発生します。

記憶域クローンには、ターゲットPDBのGUIDを使用して名前およびタグが付けられます。DBA_PDB_HISTORYビューのCLONETAG列を問い合せて、記憶域クローンのクローン・タグを表示できます。

ノート:

スナップショット・コピーの動作および効率性はベンダー固有であり、ベンダーによって異なる場合があります。

関連項目:

分割ミラーによるクローンPDBについて

Oracle ASMでは、分割ミラーは親コピーからPoint-in-Timeメディア・コピーをデタッチするプロセスです。分割後、親コピーに対する更新は子コピーに影響しません。

Oracle Database 18c以降では、親コピーは、記憶域ボリュームではなく、PDBであることが可能です。分割ミラーによるクローンPDBは親と同じメディア上に存在します。主要なユースケースでは、Oracle ASM環境でテストおよび開発のPDBを迅速にプロビジョニングします。

ノート:

分割ミラーによるクローンPDBには、Oracle ASMの柔軟性および拡張ディスク・グループが必要です。

ミラー・リフレッシュによって、親PDBからの変更で分割ミラーによるクローンPDBをリフレッシュします。実際には、この操作は、ミラー分割を削除してから新しいミラー分割を取得するのと同じです。

分割ミラーによるクローンPDBを作成するための基本的な手順は次のとおりです。

  1. SQL*Plusを起動し、CDBルートに接続します。

  2. ALTER PLUGGABLE DATABASE ... PREPARE MIRROR COPY文を発行して、クローニング元のPDBを準備します。

  3. CREATE PLUGGABLE DATABASE ... USING MIRROR COPY文を発行して、親からクローンPDBを作成します。

分割ミラーによるクローンPDBを削除するには、ALTER PLUGGABLE DATABASE ... DROP MIRROR COPYを入力します。

V$ASM_DBCLONE_INFOビューには、ソースPDB、クローニングされたPDB、およびそのファイル・グループ間の関係が表示されます。

ローカルPDBのクローニング: 基本的なステップ

ローカルPDBのクローンは、CREATE PLUGGABLE DATABASEを実行して、FROM句でソースPDBを指定することで作成できます。

前提条件

次の前提条件を満たしている必要があります。

  • 「PDB作成の一般的な前提条件」で説明している前提条件を満たします。

  • 現行ユーザーは、ルートおよびソースPDBの両方でCREATE PLUGGABLE DATABASEシステム権限を持っている必要があります。

  • ソースPDBはクローズできません。

  • CDBがローカルUNDOモードでない場合、ソースPDBは読取り専用オープン・モードである必要があります。この要件は、CDBがローカルUNDOモードの場合は適用されません。

  • CDBがARCHIVELOGモードでない場合、ソースPDBは読取り専用オープン・モードである必要があります。この要件は、CDBがARCHIVELOGモードの場合は適用されません。

  • アプリケーションPDBを作成している場合、アプリケーションPDBはアプリケーション・コンテナと同じ文字セットおよび各国語文字セットである必要があります。

    CDBのデータベース文字セットがAL32UTF8の場合、アプリケーション・コンテナの文字セットおよび各国語文字セットはCDBと異なっていても構いません。ただし、アプリケーション・コンテナ内のすべてのアプリケーションPDBには、アプリケーション・コンテナと同じ文字セットおよび各国語文字セットが必要です。

ノート:

REFRESH MODE句を使用してローカルPDBのリフレッシュ可能なクローンを作成できるのは、データベース・リンクが同じCDBにループ・バックしている場合のみです。

ローカルPDBをクローニングするには:

  1. SQL*Plusで、現在のコンテナがCDBルートまたはアプリケーション・ルートであることを確認します。

    現在のコンテナがCDBルートの場合、PDBはCDBに作成されます。現在のコンテナがアプリケーション・ルートの場合、アプリケーションPDBはアプリケーション・コンテナ内に作成されます。

  2. CREATE PLUGGABLE DATABASE文を実行し、ソースPDBをFROM句で指定します。必要に応じて、他の句を指定します。

    ローカルPDBのクローニング後、ソースPDBとターゲットPDBは同じCDBに存在します。新しいPDBはマウント・モードになっていて、そのステータスはNEWになります。PDBのオープン・モードは、V$PDBSビューのOPEN_MODE列を問い合せることで確認できます。CDB_PDBSまたはDBA_PDBSビューのSTATUS列を問い合せて、PDBのステータスを表示できます。

    PDBの新しいデフォルト・サービスが作成されます。サービスの名前はPDBと同じになり、このサービスを使用してPDBにアクセスできます。このサービスにアクセスするクライアントには、Oracle Net Serviceが正しく構成されている必要があります。

  3. 新しいPDBを読取り/書込みモードでオープンします。

    Oracle Databaseで新しいPDBをCDBに統合するには、PDBを読取り/書込みモードでオープンする必要があります。PDBを読取り専用モードでオープンしようとすると、エラーが返されます。PDBが読取り/書込みモードでオープンされると、そのステータスはNORMALになります。

  4. 新しいPDBのバックアップを作成します。

    PDBは、バックアップしないとリカバリできません。

ノート:

PDBの作成時にエラーが返された場合は、作成されたPDBがUNUSABLE状態である可能性があります。PDBの状態は、CDB_PDBSまたはDBA_PDBSビューを問い合せることで確認できます。PDB作成のエラーについてさらに学習するには、アラート・ログを確認してください。使用不可のPDBのみを削除できます。また、使用不可のPDBを削除してからでないと、同じ名前のPDBを作成できません。

ローカルPDBのクローニング: 例

次の例では、様々な要因に基づき、pdb1という名前のローカル・ソースPDBを、pdb2という名前のターゲットPDBにクローニングします。

各例で、新しいPDBが属するルートはCREATE PLUGGABLE DATABASE文の実行時の現在のコンテナによって決まります。

  • 現在のコンテナがCDBルートの場合、データベースではCDBルートにPDBが作成されます。

  • 現在のコンテナがアプリケーション・コンテナ内のアプリケーション・ルートの場合、データベースではアプリケーション・ルート内にアプリケーションPDBが作成されます。

この項では、次の項目について説明します。

句を使用しないローカルPDBのクローニング: 例

この例では、PDBをクローニングする最も簡単な方法を示しています。

この例では、次の要因を想定しています。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。したがって、FILE_NAME_CONVERT句は必要ありません。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

次の文は、pdb1 PDBからpdb2 PDBをクローニングします。

CREATE PLUGGABLE DATABASE pdb2 FROM pdb1;

関連項目:

DBCAを使用したローカルPDBのクローニング: 例

この例では、DBCAのサイレント・モードを使用してPDBをクローニングします。ホット・クローニングがサポートされます。

この例では、次の要因を想定しています。

  • ソースCDBは、SIDがorclの単一インスタンス・データベースです。

  • ソースPDBはpdb1です。クローニング操作中、pdb1はオープンのままにします。これは、ローカルUNDOおよびARCHIVELOGモードがCDBで有効になっていることを意味します。それ以外の場合、DBCAはクローン操作中にPDBをクローズし、確認を受け取った後に、ソースPDBを読取り専用モードでオープンします。

  • 新しいPDBはpdb2です。

  • DBCAを非対話型モードで実行しています。

次のコマンドは、pdb1 PDBからpdb2 PDBをクローニングします。

./dbca -silent 
  -createpluggabledatabase 
  -sourcedb orcl 
  -createpdbfrom PDB 
  -pdbName pdb2 
  -sourcepdb pdb1

関連項目:

DBCAのコマンド・リファレンスは、『Oracle Database管理者ガイド』を参照してください

PATH_PREFIX句を使用したローカルPDBのクローニング: 例

この例では、PATH_PREFIXFILE_NAME_CONVERTおよびSERVICE_NAME_CONVERT句を使用してローカルPDBをクローニングする方法を説明しています。

この例では、次の要因を想定しています。

  • パス接頭辞をPDBのディレクトリ・パスに追加する必要があります。したがって、PATH_PREFIX句が必要です。この例では、パス接頭辞/disk2/oracle/pdb2/をPDBのディレクトリ・オブジェクト・パスに追加しています。

  • コピーしたファイルのターゲットの場所を指定するには、FILE_NAME_CONVERT句が必要です。この例では、ファイルは/disk1/oracle/pdb1から/disk2/oracle/pdb2にコピーされます。

    CREATE_FILE_DEST句は使用されず、Oracle Managed FilesもPDB_FILE_NAME_CONVERT初期化パラメータも、コピーしたファイルのターゲットの場所の指定に使用されません。

    PDBのデータファイルの場所を表示するには、「例19-7」の問合せを実行します。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

  • クローニングされるPDB (pdb1)には、カリフォルニア州の営業担当者およびオーダー入力担当者のための2つのユーザー定義のサービス(salesrep_caおよびorders_ca)があります。新しいサービスはオレゴン州の営業担当者およびオーダー入力担当者のためのものであり、クローニングされたPDB (pdb2)でサービス名はsalesrep_orおよびorders_orにそれぞれ名前変更されます。

  • PDB内で今後作成される表領域は、デフォルトでNOLOGGING属性を使用して作成されます。この機能は、Oracle Database 12cリリース1 (12.1.0.2)以降で使用可能です。

次の文は、pdb1 PDBからpdb2 PDBをクローニングします。

CREATE PLUGGABLE DATABASE pdb2 FROM pdb1 
  PATH_PREFIX = '/disk2/oracle/pdb2/'
  FILE_NAME_CONVERT = ('/disk1/oracle/pdb1/', '/disk2/oracle/pdb2/')
  SERVICE_NAME_CONVERT = ('salesrep_ca','salesrep_or','orders_ca','orders_or')
  NOLOGGING;

STORAGE句を使用したローカルPDBのクローニング: 例

この例では、FILE_NAME_CONVERTSTORAGEおよびSERVICE_NAME_CONVERT句を使用してローカルPDBをクローニングします。

この例では、次の要因を想定しています。

  • PATH_PREFIX句は必要ありません。

  • コピーしたファイルのターゲットの場所を指定するには、FILE_NAME_CONVERT句が必要です。この例では、ファイルは/disk1/oracle/pdb1から/disk2/oracle/pdb2にコピーされます。

    CREATE_FILE_DEST句は使用されず、Oracle Managed FilesもPDB_FILE_NAME_CONVERT初期化パラメータも、コピーしたファイルのターゲットの場所の指定に使用されません。

    PDBのデータファイルの場所を表示するには、例19-7の問合せを実行します。

  • PDBにストレージ制限を強制する必要があります。したがって、STORAGE句が必要です。特に、PDBに属する表領域はいずれも2GBを超えることはできません。

  • ソースPDB (pdb1)には、カリフォルニア州の営業担当者およびオーダー入力担当者のための2つのユーザー定義のサービス(salesrep_caおよびorders_ca)があります。新しいサービスはオレゴン州の営業担当者およびオーダー入力担当者のためのものであり、クローニングされたPDB (pdb2)でサービス名はsalesrep_orおよびorders_orにそれぞれ名前変更されます。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

次の文は、pdb1 PDBからpdb2 PDBをクローニングします。

CREATE PLUGGABLE DATABASE pdb2 FROM pdb1 
  FILE_NAME_CONVERT = ('/disk1/oracle/pdb1/', '/disk2/oracle/pdb2/')
  STORAGE (MAXSIZE 2G)
  SERVICE_NAME_CONVERT = ('salesrep_ca','salesrep_or','orders_ca','orders_or');

NO DATA句を使用したローカルPDBのクローニング: 例

この例では、PDBのデータ・モデル定義をクローニングしますが、PDBのデータはクローニングしません。

この例では、次の要因を想定しています。

  • NO DATA句は、目的がデータをクローニングせずにソースPDBのデータ・モデル定義をクローニングすることであるため必要です。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。したがって、FILE_NAME_CONVERT句は必要ありません。プロセスでは、Oracle Managed Files構成または初期化パラメータ設定に基づいて、ファイルが新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

ソースPDB pdb1にデータが大量にあるとします。次のステップでは、操作の完了時にソースPDBのデータがクローンに含まれない動作の内容を示します。

  1. ソースPDB pdb1を現在のコンテナとして使用し、データが大量にある表を問い合せます。

    SELECT COUNT(*) FROM tpch.lineitem;
    
      COUNT(*)
    ----------
      60001215
    

    表には、6000万超の行があります。

  2. NO DATA句を指定して、ソースPDBをクローニングします。

    CREATE PLUGGABLE DATABASE pdb2 FROM pdb1 NO DATA;
    
  3. クローニングしたPDBをオープンします。

    ALTER PLUGGABLE DATABASE pdb2 OPEN;
    
  4. クローニングしたPDB pdb2を現在のコンテナとして使用し、ソースPDB内のデータが大量にある表を問い合せます。

    SELECT COUNT(*) FROM tpch.lineitem;
    
      COUNT(*)
    ----------
             0
    

    クローニングしたPDB内の表には行がありません。

PDBスナップショットからのPDBのクローニング: シナリオ

このシナリオでは、CREATE PLUGGABLE DATABASE ... USING SNAPSHOTを実行して、PDBスナップショットから新しいPDBを作成します。

想定

この例では、次の要因を想定しています。

  • 8個の日次スナップショットを含むPDBスナップショット・カルーセルが存在し、スナップショットには曜日、日、作成された時間が後に続く名前が付けられます(例: pdb1_mon_2_1201pdb1_tue_3_1201pdb1_wed_4_1201)。

  • 新しいPDBはpdb1_wed_4_1201という名前のスナップショットのクローンで、これは先週の水曜日、その月の4日の午前12時1分に取得されたpdb1のスナップショットです。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。したがって、FILE_NAME_CONVERT句は必要ありません。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

PDBスナップショットからPDBをクローニングするには:

  1. SQL*Plusで、現在のコンテナがCDBルートまたはアプリケーション・ルートであることを確認します。

    現在のコンテナがCDBルートの場合、PDBはCDBに作成されます。現在のコンテナがアプリケーション・ルートの場合、アプリケーションPDBはアプリケーション・コンテナ内に作成されます。

  2. CREATE PLUGGABLE DATABASE文を実行します。

    次の文は、pdb1_wed_4_1201という名前のPDBのスナップショットからpdb1_copy PDBをクローニングします。

    CREATE PLUGGABLE DATABASE pdb1_copy FROM pdb1 USING SNAPSHOT pdb1_wed_4_1201;
    

スナップショット・コピーPDBの作成: 例

この例では、SNAPSHOT COPY句を使用してスナップショット・コピーPDBを作成します。

この例では、次の要因を想定しています。

  • 新しいスナップショット・コピーPDBはpdb1_snap3という名前のPDBスナップショットに基づいて作成され、このPDBスナップショットは、特定の時点とSCNにおけるpdb1のコピーです。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。したがって、FILE_NAME_CONVERT句は必要ありません。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

前述の要因に基づき、次の文によって、pdb1_snap3 PDBスナップショットからpdb1_snap_copy PDBがクローニングされます。

CREATE PLUGGABLE DATABASE pdb1_snap_copy FROM pdb1 USING SNAPSHOT pdb1_snap3 SNAPSHOT COPY;

pdb1_snap_copyは、作成された後にpdb1_snap3 PDBスナップショットに依存します。したがって、pdb1_snap_copyが存在する場合は、pdb1_snap3を削除できません。ただし、ALTER PLUGGABLE DATABASE ... MATERIALIZE文を実行して、pd1_snap_copyをスナップショット・コピーPDBから通常のPDBに変換できます。PDBのマテリアライズとは、pdb1_snap_copypdb1_snap3に依存しなくなり、pdb1_snap3が削除可能になることを意味します。

リモートPDBのクローニング: 基本的なステップ

PDBは、リモートPDBをクローニングすることで作成できます。クローニング操作後、ソースとターゲットPDBは異なる場所にあります。

一般的な前提条件

次の前提条件を満たしている必要があります。

  • 「PDB作成の一般的な前提条件」で説明している前提条件を満たします。

  • 現行ユーザーは、ターゲットPDBが含まれるCDBのルートでCREATE PLUGGABLE DATABASEシステム権限を持っている必要があります。

  • ソースとターゲットのプラットフォームは、次の要件を満たしている必要があります。

    • endiannessが同じである必要があります。

    • ソース・プラットフォームにインストールされているデータベース・オプションは、ターゲット・プラットフォームにインストールされているデータベース・オプションと同じか、サブセットである必要があります。

  • アプリケーションPDBを作成している場合、ソースPDBのアプリケーション名およびバージョンは、ターゲット・アプリケーション・コンテナのアプリケーション名およびバージョンと一致する必要があります。

文字セットの前提条件

  • PDBがクローニングされるCDBの文字セットがAL32UTF8でない場合、ソースとターゲットには互換性のある文字セットおよび各国語文字セットが必要です。PDBがクローニングされるCDBの文字セットがAL32UTF8である場合、この要件は適用されません。

  • アプリケーションPDBを作成している場合、アプリケーションPDBはアプリケーション・コンテナと同じ文字セットおよび各国語文字セットである必要があります。

    CDBのデータベース文字セットがAL32UTF8の場合、アプリケーション・コンテナの文字セットおよび各国語文字セットはCDBと異なっていても構いません。ただし、アプリケーション・コンテナ内のすべてのアプリケーションPDBには、アプリケーション・コンテナと同じ文字セットおよび各国語文字セットが必要です。

ソースPDBのオープン・モードの前提条件

  • ソースPDBはクローズできません。

  • リモートCDBがローカルUNDOモードでない場合、ソースPDBは読取り専用モードでオープンしている必要があります。

    「CDB UNDOモードについて」を参照してください。

  • リモートCDBがARCHIVELOGモードでない場合、ソースPDBは読取り専用モードでオープンしている必要があります。

  • リフレッシュ可能なPDBを作成している場合、ソースPDBはARCHIVELOGモードおよびローカルUNDOモードである必要があります。

データベース・リンクの前提条件

次の前提条件を満たしている必要があります。

  • データベース・リンクは、PDBがクローニングされるCDBからソースPDBのCDBへの接続を有効にする必要があります。データベース・リンクは、CDBのルート、アプリケーションPDB (ソースがアプリケーションPDBの場合)、またはPDBのいずれかに接続できます。

  • データベース・リンクが接続するユーザーには、CREATE PLUGGABLE DATABASEシステム権限が必要です。

  • データベース・リンクがソースPDBのCDBのルートに接続する場合、データベース・リンクが接続するユーザーは、共通ユーザーである必要があります。

  • Oracle Data Guard環境でプライマリCDBへのPDBのリモート・クローンを実行している場合は、スタンバイCDBでSTANDBY_PDB_SOURCE_FILE_DBLINK初期化パラメータを設定します。このパラメータは、CREATE PLUGGABLE DATABASE ... FROM dblinkで使用するデータベース・リンクの名前を指定します。スタンバイCDBでは、ソースPDBが読取り専用モードでオープンしている場合のみ、データベース・リンクで参照されるソースPDBからデータファイルのコピーを試みます。それ以外の場合は、スタンバイCDBでデータ・ファイルをOracle Managed Filesの場所にコピーする必要があります。

リモートPDBをクローニングするには:

  1. SQL*Plusで、現在のコンテナがターゲットCDBのルートまたはターゲット・アプリケーション・コンテナのアプリケーション・ルートであることを確認します。

  2. CREATE PLUGGABLE DATABASE文を実行し、ソースPDBをFROM句で指定します。必要に応じて、他の句を指定します。

    作成したPDBはマウント・モードになり、そのステータスはNEWです。PDBのオープン・モードは、V$PDBSビューのOPEN_MODE列を問い合せることで確認できます。CDB_PDBSまたはDBA_PDBSビューのSTATUS列を問い合せて、PDBのステータスを表示できます。

    PDBの新しいデフォルト・サービスが作成されます。サービスの名前はPDBと同じになり、このサービスを使用してPDBにアクセスできます。このサービスにアクセスするクライアントには、Oracle Net Serviceが正しく構成されている必要があります。

    ノート:

    PDBの作成時にエラーが返された場合は、作成されたPDBがUNUSABLE状態である可能性があります。CDB_PDBSまたはDBA_PDBSビューを問い合せてPDBの状態を確認したり、アラート・ログをチェックしてPDBの作成エラーについてさらに学習できます。使用不可のPDBは削除することのみができ、使用不可のPDBと同じ名前のPDBを作成できるようにするには、その前に削除する必要があります。

  3. 新しいPDBを読取り/書込みモードでオープンします。

    Oracle Databaseで新しいPDBをCDBに統合するには、PDBを読取り/書込みモードでオープンする必要があります。PDBを読取り専用モードでオープンしようとすると、エラーが返されます。PDBが読取り/書込みモードでオープンされると、そのステータスはNORMALになります。

  4. PDBをバックアップします。

    PDBは、バックアップしないとリカバリできません。

関連項目:

リモートPDBまたは非CDBのクローニング: 例

これらの例では、様々な要因に基づき、リモートPDBまたは非CDBをクローニングします。

各例で、新しいPDBが属するルートはCREATE PLUGGABLE DATABASE文の実行時の現在のコンテナによって決まります。

  • 現在のコンテナがCDBルートの場合、新しいPDBはCDBルートに作成されます。

  • 現在のコンテナがアプリケーション・コンテナ内のアプリケーション・ルートの場合、新しいPDBはアプリケーション・ルート内にアプリケーションPDBとして作成されます。

この項では、次の項目について説明します。

句を使用しないリモートPDBのクローニング: 例

次の例では、様々な要因に基づき、pdb1という名前のリモート・ソースPDBを、pdb2という名前のターゲットPDBにクローニングします。

この例では、次の要因を想定しています。

  • リモートPDBへのデータベース・リンク名はpdb1_linkです。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

次の文は、pdb1リモートPDBからpdb2 PDBをクローニングします。

CREATE PLUGGABLE DATABASE pdb2 FROM pdb1@pdb1_link;

関連項目:

リモート非CDBのクローニング: 例

次の例では、様々な要因に基づき、mydbという名前のリモート・ソース非CDBを、pdb2という名前のターゲットPDBにクローニングして新しいPDBを作成します。

この例では、次の要因を想定しています。

  • リモート非CDBへのデータベース・リンク名はmydb_linkです。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

次の文は、mydbという名前のリモート非CDBからpdb2 PDBを作成します。

CREATE PLUGGABLE DATABASE pdb2 FROM mydb@mydb_link;

ソース・データベースが非CDBである場合、非CDBの名前のかわりにNON$CDBを使用できます。たとえば、次の文は前の例と同じです。

CREATE PLUGGABLE DATABASE pdb2 FROM NON$CDB@mydb_link;

関連項目:

Oracle Managed Filesの詳細は、『Oracle Database管理者ガイド』を参照してください

リフレッシュ可能なクローンの作成: 例

この例では、様々な要因に基づき、リモートpdb1をターゲットpdb2にクローニングします。

クローンはソースPDBのリフレッシュ可能なコピーです。クローニングされたPDBをリフレッシュして、ソースPDBに対して行われた変更で更新できます。この例では、次の要因を想定しています。

  • リモートPDBへのデータベース・リンク名はpdb1_linkです。

  • PATH_PREFIX句は必要ありません。

  • FILE_NAME_CONVERT句およびCREATE_FILE_DEST句は必要ありません。

    Oracle Managed Filesが有効であるか、またはPDB_FILE_NAME_CONVERT初期化パラメータが設定されています。これらのファイルは、Oracle Managed Files構成または初期化パラメータ設定に基づいて新しい場所にコピーされます。

  • PDBにはストレージ制限は必要ありません。したがって、STORAGE句は必要ありません。

  • ターゲットの場所に、作成される新しい一時ファイルと同じ名前のファイルはありません。したがって、TEMPFILE REUSE句は必要ありません。

  • リフレッシュ可能なクローンは、60分ごとに自動的にリフレッシュされます。

ノート:

リフレッシュ可能なPDBを作成するには、ソースPDBがARCHIVELOGモードおよびローカルUNDOモードである必要があります。

次の文は、pdb1リモートPDBからpdb2 PDBをクローニングします。

CREATE PLUGGABLE DATABASE pdb2 FROM pdb1@pdb1_link REFRESH MODE EVERY 60 MINUTES;

関連項目:

PDBのクローニング後

PDBのクローニング後に、ユーザーと表領域に関する特定のルールが適用されます。

PDBのクローニング後、次の内容が適用されます。

  • ソース非CDBまたはPDBのデフォルト一時表領域を使用していたPDBのユーザーは、クローンPDBのデフォルト一時表領域を使用します。非CDBまたはPDB内のデフォルト以外の一時表領域を使用していたユーザーは、クローニングされたPDB内の同じローカル一時表領域を引き続き使用します。

  • リモートPDBのクローニング時、ソースCDBに存在するが、ターゲットCDBには存在しない、ユーザーが作成した共通ユーザー・アカウントには、共通して付与された権限がありません。ただし、ターゲットCDBに共通ユーザーが存在し、PDBの共通ユーザーと同じ名前である場合、後者は前者にリンクされ、ターゲットCDBの共通ユーザーに付与された権限を持ちます。

    クローニングまたは接続されたPDBにターゲットCDBに存在しない共通ユーザー・アカウントが存在し、このユーザーがPDB内のオブジェクトを所有していない場合、Oracle Databaseでは同期ステップ中にユーザーが削除されます。それ以外の場合、ユーザー・アカウントはターゲットPDBでロックされます。ロックされたアカウントに関して、次のオプションがあります。

    • PDBをクローニングし、ルートに接続し、同じ名前で共通ユーザー・アカウントを作成します。PDBを読取り/書込みモードでオープンすると、ユーザー・アカウントに共通して付与されているロールや権限の相違点が解決され、アカウントをロック解除できます。ユーザー・アカウントに対してローカルに付与されている権限やロールは、このプロセス中も変更されません。

    • PDBに新しいローカル・ユーザー・アカウントを作成し、データ・ポンプを使用して、ロックされたユーザーのデータを新しいローカル・ユーザーのスキーマにエクスポート/インポートします。

    • ユーザー・アカウントはロックされたままにします。

    • ユーザー・アカウントを削除します。

関連項目:

スナップショット・コピーPDBのマテリアライズ

MATERIALIZE句を指定したALTER PLUGGABLE DATABASE文を実行して、スナップショット・コピーPDBをマテリアライズできます。スナップショット・コピーPDBをマテリアライズすると、すべてのデータ・ブロックがコピーされます。

スナップショット・コピーPDBを作成する場合、ソースPDBに依存しています。この依存関係があるため、ソースPDBを削除できません。

スナップショット・コピーPDBをマテリアライズすると、スパース・ファイルを使用するスナップショット・コピーPDBは、スパース・ファイルを使用しない完全PDBに変換されます。したがって、ソースPDBに依存しなくなるため、削除が可能になります。

ノート:

USING SNAPSHOT句を使用して作成されたPDBスナップショットと、SNAPSHOT COPY句を使用して作成されたスナップショット・コピーPDBは、2つの異なるタイプのスナップショットなので混同しないでください。USING SNAPSHOT句では、マテリアライズが不要な完全なPDBが作成されます。SNAPSHOT COPY句では、基になるPDBスナップショットを削除する場合に、マテリアライズが必要なスパースPDBが作成されます。

PDBスナップショットをマテリアライズするには:

  1. SQL*Plusで、現在のコンテナがマテリアライズされるスナップショット・コピーPDBであることを確認します。

  2. MATERIALIZE句を指定してALTER PLUGGABLE DATABASE文を実行します。

例7-2 スナップショット・コピーPDBのマテリアライズ

次のSQL文は、スナップショット・コピーPDBをマテリアライズします。

ALTER PLUGGABLE DATABASE MATERIALIZE;

関連項目: