1.PDBの移動概要
PDBの移動は、マルチテナント・コンテナ・データベース(以降CDB)からPDBをアンプラグして(引き抜いて)、プラグして(差し込んで)行います。
アンプラグすると、PDBに関連する情報がxmlファイルに出力されます。そのxmlファイルとPDBのデータ・ファイルを丸ごとコピーして、移動します。
マルチテナント・アーキテクチャでは、PDB毎にSystemの情報がきちんと物理レベルで分離されていて、ユーザーやオブジェクトの情報などをPDBに包含しています。そのため、PDBの環境をそのまま移動することが可能になります。
今回は第1回で作成したPDB2を他のCDBに移動して、PDB2に作成したHRユーザーやEMP表がちゃんと移動できていることを確認しましょう。
2.CDBの作成
PDBを移動するには、移動先のCDBが必要です。
CDBが一つしか無い場合は、もう一つCDBを作成しましょう。
第1回に参照したインストール・ガイド (PDF)の「4.2 DBCA によるデータベース作成」に従ってデータベースを作成してください。その際、「5. データベース識別情報入力」で、グローバル・デーベース名およびSIDには”orcl2”を入力してください。また、PDBは作成する必要が無いので、「空のコンテナ・データベースの作成」を選択します。
(この名前は一意である必要があり、第一回と同じ名前”orcl”では作成できないためです)
後は、ガイドに従ってデータベースを作成してください。

また、作成完了後は第1回を参考に、CDB2として接続の追加をし、DBAビューにもCDB2の接続を追加しておいてください。
「データベース接続の作成/選択」画面では、以下のようにCDB2をします。

接続の作成と、DBAビューでのCDB2への接続の追加が完了すると、以下の図のようにCDB2が追加されている状態になります。

3.PDBの移動
以降、新たに作ったデータベース名が”orcl2”のCDBをCDB2とし、既存のデータベース名が”orcl”のCDBをCDB1として説明します。
PDBの移動は、以下の図のようにまずはCDB1でPDB2をアンプラグし、ファイルを移動またはコピーして、CDB2にプラグする操作になります。
同じサーバー上の場合や、異なるサーバーでも共有ストレージを使用している場合などは、アンプラグしたファイルを参照できるので、コピーや移動は必須ではありません。そのため非常に高速にPDBに移動が行えます。

今回は、同じサーバー上で異なるCDBへの移動なので、ファイルの移動やコピーは不要ですが、ことなるサーバー上のCDBへ移動することも考えて、ファイルを移動して実施します。
PDBの移動もSQL Developerから実施します。SQLコマンドでも実行できますが、SQL DeveloperではGUIを使用して、より簡単に行えます。その他Enterprise Managerを使用した場合もGUIで操作することが可能です。
3.1. PDBのアンプラグ
PDBの移動を行うには、移動するPDBがクローズ状態になっている必要があります。そのため、まずはSQL Developerで接続して、PDB2をクローズしてください。
クローズするには、SQL DeveloperのDBAビューからCDB1を展開し、PDB2を右クリックして「状態の変更」を選択します。

次に、「新しい状態」が”CLOSE”になっていることを確認し、「適用」ボタンをクリックしてPDB2をクローズします。

それでは、次にアンプラグを実施します。
クローズと同様にPDB2を右クリックし、今度は「プラガブル・データベースの切断」を選択します。

次にPDB2の情報を出力するXMLファイル名を入力して、「適用」ボタンをクリックします。今回は、デフォルトのファイル名のまま出力します。その場合は、データベース・サーバー上のORACE_HOMEの下の、dbsディレクトリの下に、”PDB2.XML”というファイルで出力されます。パスやファイル名を変更する場合は、「選択」ボタンをクリックして任意のフォルダおよびファイル名を選択および入力してください。

アンプラグが成功すると、PDB2がDBAビューのCDB1のコンテナ・データベースから消えます。これでアンプラグが完了です。
(アンプラグ時にPDBをそのまま残しておくこともできますが、SQL DeveloperはデフォルトでアンプラグしたPDBは、CDBから削除します。削除しない場合は、SQLタグからSQL文を変更する必要があります)
3.2. PDBファイルのコピー/移動
次に、CDB1からアンプラグしたPDB2のファイルを、CDB2にプラグします。
データベース・サーバー上にある、PDB2のファイルをディレクトリ毎移動します。まずは、データベース・サーバー上にログインし、ORACLE_BASEディレクトリの下のoradata/orclディレクトリに移動してください。
(前述のインストール・ガイドに沿ってインストールした場合は、ORCLE_BASEは/u01/app/oracle/なので、/u01/app/oracle/oradata/orclに移動してください)
移動したディレクトリの下に、pdb2ディレクトリがあるので、ディレクトリごとorcl2の下に移動します。
前述したように、今回は同じサーバー上でファイルを参照できるので、ファイルのコピーは不要です。ですが、データ・ファイルの管理がし易いように、CDB2(orcl2)のデータ・ファイルがあるディレクトリの配下に、PDB2のファイルを移動しています。ストレージやファイル・システムによってはスナップショットを作成することで高速にコピーや移動が可能です。
$ ls /pdb2
sysaux01.dbf system01.dbf users01.dbf
$ mv ./pdb2 ../orcl2/pdb2
$ cd ../orcl2/pdb2
$ pwd
/u01/app/oracle/oradata/orcl2/pdb2
$ ls
sysaux01.dbf system01.dbf users01.dbf
3.3. PDBのプラグ
次に、コピーしたPDB2をCDB2にプラグします。
移動先のCDBであるCDB2で右クリックし、「プラガブル・データベースのプラグイン」を選択します。

「プラガブル・データベースのプラグイン」画面がポップアップ表示されますので、アンプラグした時に生成したXMLファイルを指定し、またデータベース名には任意のPDB名を指定します。ここではデータベース名にNEW_PDB2を指定し、XMLファイルにはアンプラグに指定した”PDB2.XML”を指定します。
また、データ・ファイルの場所を変更する場合は、どのように変更するかを「ソース・ファイルの変換」で指定します。
今回は、” /u01/app/oracle/oradata/orcl/pdb2”ディレクトリから、” /u01/app/oracle/oradata/orcl2/pdb2”ディレクトリにデータ・ファイルをコピーしています。
そのため、文字列”orcl”を”orcl2”に変換するように指定しています。
また、「コピー・アクション」はファイルを元の場所(変換前の場所)から、先の場所(変換後の場所)にコピーするかどうかを指定します。今回は事前にファイルを移動しているので、”NOCOPY”(コピーしない)を選択します。
以上を選択/入力後、「適用」ボタンをクリックしてPDBをプラグします。

プラグが完了すると、移動先のDBAビューでCDB2のコンテナ・データベースにNEW_PDB2が表示されます。

以上で、PDB2の移動が完了しました。
それでは、CDB2に移動したNEW_PDB2に接続して、HRスキーマやEMP表がちゃんと移動しているかを確認してみます。
PDBをプラグした段階では、オープンされていないので接続ができません。NEW_PDB2の状態を変更してREAD WRITEでオープンしてください。
次に、接続ビューにNEW_PDB2の接続を追加してください。
その際、「データベース接続の作成/選択」画面の「サービス名」にはnew_pdb2を指定します。「ユーザー名」と「パスワード」は、移動する前のPDB2と同じものを指定します。

NEW_PDB2の接続の作成が完了すると、「他のユーザー」からHRユーザーとEMP表が有ることを確認できると思います。

4.まとめ
今回は、SQL Developerを使用してプラガブル・データベース (PDB) の移動(アンプラグ、プラグ)を実施しました。
PDBの移動がファイルのコピーや移動によって簡単に行えるのは、PDBが物理レベルで分離されていて、ユーザーの情報など必要な情報をPDB内に包含しているためです。これはマルチテナント・アーキテクチャの大きな特徴になります。
移動(アンプラグ、プラグ)は、単にPDBを移動するためだけではなく、新しい環境に移動することで、パッチの適用、アップグレードなども素早く行え、非常に便利な機能です。いろいろな所で使えるので、ぜひ活用してください。
5回にわたってPDBの作成から、基本的な操作までマルチテナント・アーキテクチャについて確認しました。
次回からは、ILM(Information Lifecycle Management)関連の新機能について紹介してきたいと思います。
