Oracleマルチテナント・データベースでPDBをアンプラグ&プラグする方法
本記事では、プラガブル・データベース(PDB)をソース側のコンテナ・データベース(CDB)から切り離す「アンプラグ」を行い、ターゲット側のCDBへ接続する「プラグ」を実行する手順を詳しく解説します。ここで扱うPDBは、アプリケーション関連のデータベースをすべて格納するためのデータベースです。
はじめに
CDBには、異なるアプリケーション向けのゼロ個以上のPDBが含まれ、Oracle®関連のメタデータや共通ユーザーを格納するルート・コンテナが必ず1つ存在します。ルート・コンテナの名前はCDB$ROOTです。さらに、ルート・コンテナにはシードPDBであるPDB$SEEDが1つ含まれています。このシードPDBはシステム提供のテンプレートであり、CDBが新しいPDBを作成する際に利用されます。PDBは、非コンテナ環境で使用してきた従来型のデータベースと同じものです。Oracleはバージョン12cでコンテナおよびPDB機能を導入し、ビジネス要件に応じて柔軟にPDBを追加できるようになりました。たとえば、営業部門のデータを格納する営業アプリケーション用のPDBや、人事(HR)部門のデータを格納するHRアプリケーション用のPDBを作成することができます。
「PDBをアンプラグする」とは、PDBをソースCDBから切り離し、別のターゲットCDBへ接続することを意味します。
本記事では、ソースCDBであるTEST12が2つのPDB(PDB1とPDB2)を持っており、アンプラグされたPDBを受け取るターゲットCDBとしてDEV12を使用します。
PDBのアンプラグとプラグの実践例
このセクションでは、ソースCDB TEST12からPDB1とPDB2をアンプラグし、ターゲットCDB DEV12にプラグする具体的な手順を紹介します。
変更作業の前に、ソース側のPDBは以下の画像のようにMOUNTED状態になっています。

ターゲットCDBとの互換性チェック
プラグ操作を開始する前に、接続予定のPDBが新しいホストCDBと互換性があることを確認しましょう。互換性がない場合、以下のPL/SQLブロックを実行するとエラーが発生します。
. oraenv
[プロンプトで dev12 を入力]
sqlplus / as sysdba
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml ');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? NO');
end if;
END;
/
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/pdb2/pdb2.xml');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? NO');
end if;
END;
/
PDBのクローズ
アンプラグできるようにするため、まずPDBをクローズします。以下のSQL*Plus®ステートメントを実行してください。
. oraenv
[プロンプトで test12 を入力]
sqlplus / as sysdba
alter pluggable database pdb1 close immediate;
alter pluggable database pdb2 close immediate;
これにより、ソース側のPDBはマウント状態でclosed(クローズ済み)になります。
PDBのアンプラグ
PDBをクローズしたら、XMLマニフェストファイルを生成します。このXMLファイルには、アンプラグ対象のPDBに関する表領域の名前と完全パス、およびデータファイルの情報が記録されます。
クローズ済みのPDBをアンプラグし、XMLファイルのパスと名前を指定するには、以下のコマンドを実行します。
alter pluggable database pdb1 unplug into '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml';
alter pluggable database pdb2 unplug into '/home/oracle/app/oradata/pdb2/pdb2.xml';
次に、クローズ済みのPDBをドロップしつつ、データファイルは保持するように指定します。
drop pluggable database pdb1 keep datafiles;
drop pluggable database pdb2 keep datafiles;
アンプラグ後のPDBの状態を確認するには、以下のコマンドを実行します。
select pdb_name, status from cdb_pdbs where pdb_name in ('PDB1', 'PDB2');
[行が表示されないことを確認]
exit
PDBのプラグ
PDBをターゲットCDBにプラグするには、COPY方式、NOCOPY方式、CLONE MOVE方式のいずれかを使用できます。
COPY方式によるプラグ
COPY方式でPDBをプラグする場合は、新しいデータファイルの配置先を作成・定義し、アンプラグ済みのPDBをターゲットCDBに接続したうえで、そのデータファイルをコピーします。
まず、配置先ディレクトリを作成します。
mkdir /home/oracle/app/oradata/DEV12/pdb1
sqlplus / as sysdba
アンプラグ済みPDBのデータファイルを使ってCDBにプラグし、データファイルを新しい場所へコピーするには、以下のコマンドを実行します。
create pluggable database pdb_plug_copy using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
COPY
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/pdb1');
プラグ後のPDBのステータスとオープンモードを確認します。
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_COPY';
select open_mode from v$pdbs where name='PDB_PLUG_COPY';
-- プラグ済みPDBのデータファイル一覧を表示
select name from v$datafile where con_id=3;
exit
これらの操作の結果は以下の画像の通りです。

NOCOPY方式によるプラグ
NOCOPY方式は、アンプラグ済みPDBのデータファイルをそのまま使い、コピーを作成せずにターゲットCDBへプラグする方法です。
NOCOPY方式でプラグするには、以下のコマンドを実行します。
create pluggable database pdb_plug_nocopy using '/home/oracle/app/oradata/pdb2/pdb2.xml'
NOCOPY
TEMPFILE REUSE;
この操作は数秒で完了します。アンプラグ済みPDBの元のデータファイルは、新しいホストCDB上の新しくプラグされたPDBに引き継がれます。XMLファイルで指定されたtempファイルと同名のファイルがターゲットの場所に既に存在するため、TEMPFILE_REUSE句が必要になります。
プラグ後のPDBのステータスとオープンモードを確認します。
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_NOCOPY';
select open_mode from v$pdbs where name='PDB_PLUG_NOCOPY';
これらの操作の結果は以下の画像の通りです。

プラグ済みPDBのデータファイル一覧を確認するには、以下のコマンドを実行します。
select name from v$datafile where con_id=3;
select name from v$datafile where con_id=4;
exit
CLONE MOVE方式によるプラグ
CLONE MOVE方式でPDBをプラグする場合は、新しいデータファイルの配置先を作成・定義し、アンプラグ済みPDBのデータファイルを使ってターゲットCDBに接続したうえで、データファイルを別の場所へ移動します。
まず、配置先ディレクトリを作成します。
mkdir /home/oracle/app/oradata/DEV12/clone
sqlplus / as sysdba
PDBをCDBにプラグし、データファイルを新しい場所へ移動するには、以下のコマンドを実行します。
create pluggable database pdb_plug_move using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone ');
ここでエラーメッセージが表示されます。これは、グローバル一意識別子(GUID)が一意でないためです。PDB1はすでにCOPY方式でプラグされているため、GUIDが競合しています。以下の画像をご覧ください。

この問題を解決するには、AS CLONE句を付けて以下のコードを実行します。
create pluggable database pdb_plug_move
AS CLONE using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone');
プラグ後のPDBのステータスとオープンモードを確認します。
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_MOVE';
select open_mode from v$pdbs where name='PDB_PLUG_MOVE';
プラグ済みPDBのデータファイル一覧を表示します。
select name from v$datafile where con_id=5;
これらの操作の結果は以下の画像の通りです。

プラグ済みPDBのオープン
PDBをオープンしてプラグ操作を完了させるには、以下のコマンドを実行します。
alter pluggable database pdb_plug_nocopy open;
alter pluggable database pdb_plug_copy open;
alter pluggable database pdb_plug_move open;
プラグ済みPDBに接続し、接続先のコンテナ名を確認するには、以下のコマンドを実行します。
connect sys/*****@localhost:1521/pdb_plug_nocopy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_copy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_move AS SYSDBA
show con_name
exit
PDBをソースCDBへ戻す
まず、すべてのプラガブル・データベースをクローズします。
. oraenv
[プロンプトで dev12 を入力]
sqlplus / as sysdba
alter pluggable database all close immediate;
pdb1データベースを再作成できるように、pdb_plug_copyデータベースをアンプラグします。
alter pluggable database pdb_plug_copy unplug into '/home/oracle/app/oradata /pdb_plug_copy.xml';
pdb_plug_copyデータベースをドロップします。
drop pluggable database pdb_plug_copy;
pdb2データベースを再作成できるように、pdb_plug_nocopyデータベースをアンプラグしてドロップします。
alter pluggable database pdb_plug_nocopy unplug into '/home/oracle/app/oradata /pdb_plug_nocopy.xml';
drop pluggable database pdb_plug_nocopy keep datafiles;
pdb_plug_moveデータベースをドロップします。
drop pluggable database pdb_plug_move;
pdb1データベースをTEST12 CDBへ再度プラグします。
connect sys/*****@localhost:1521/test12 as sysdba
create pluggable database pdb1 AS CLONE using '/u01/app/oracle/oradata/pdb_plug_copy.xml'
MOVE
FILE_NAME_CONVERT=(' /home/oracle/app/oradata/DEV12/pdb1',' /home/oracle/app/oradata/TEST12/pdb1');
同様に、pdb2データベースをTEST12 CDBへ再度プラグします。
create pluggable database pdb2 using '/u01/app/oracle/oradata/pdb_plug_nocopy.xml' nocopy tempfile reuse;
pdb1とpdb2をオープンします。
alter pluggable database pdb2 open;
alter pluggable database pdb1 open;
exit
まとめ
PDBのアンプラグとプラグを活用すれば、サーバー間のファイル転送を簡素化でき、人為的なミスの発生リスクも低減できます。たとえば、すべてのPDBに対してパッチを一括で適用できますが、非コンテナ環境では各データベースに個別にパッチを適用する必要があります。バックアップなどの保守作業も、コンテナ&PDB環境の方がはるかに簡単です。サーバー間で転送するファイルが1つのマニフェストにまとめられるため、転送ファイルの一部をうっかり忘れるといった事故も防げます。
本記事が、非コンテナ・データベースに対する12cのPDB/CDB機能のメリットを理解する一助となれば幸いです。
ご意見やご質問がある場合は、フィードバックタブをご利用ください。
データベースサービスの詳細については、ぜひご相談ください。
-
Database-as-a-Service(DBaaS)とは?メリット・デメリットと導入判断のポイントを徹底解説
本記事は、2017年12月7日にObjectRocket.com/blogで公開された記事をもとにしています。業務を社内でまかなうか、外部にアウトソーシングするか――多くの企業が直面するこの判断は、データベース管理において特に悩ましい問題です。本記事では、Database-as-a-Service(DBaaS)の長所と短所を詳しく解説し、貴社にとってDBaaSが適切な選択肢となるかを見極めるためのポイントをご紹介します。特にテック系企業など創業期の会社によくある疑問が、「特定の機能を外注すべきか、それとも社内で行うべきか」という点です。自前でチームを雇うにも、外部企業に依頼するにも費用がかかる
-
OracleのSQLプロファイルとSQLプラン・ベースラインの違いと活用方法
本記事では、Oracle®におけるSQLプロファイルとSQLプラン・ベースラインの違いを解説し、クエリチューニング時にそれぞれがどのように機能するのかを詳しく説明します。オプティマイザ、プロファイル、ベースラインの関係これら3つの要素は、大まかに以下のように連携して動作します。クエリオプティマイザは、システム統計、バインド変数、コンパイル情報などを基に、クエリ実行に最適なプランを導き出します。しかし、入力情報に不備があると、必ずしも最適とは言えないプランを選択してしまうことがあります。SQLプロファイルには、こうした問題を緩和するための補助情報が含まれています。これによりオプティマイザの判断ミ