マルチテナントデータベースのプラグを抜き差しする
このブログでは、1つのプラガブルデータベース(PDB)をsourcecontainerデータベース(CDB)からデタッチし、それをターゲットCDBに接続する方法について説明します。このブログでは、PDBは、アプリケーション関連のすべてのデータベースを保存するデータベースです。
CDBには、さまざまなアプリケーションに関連する0個以上のPDBデータベースが含まれ、Oracle®関連のメタデータと一般ユーザーを格納するルートコンテナが1つだけ含まれています。ルートコンテナの名前はCDB$ROOT
です。 。ルートコンテナには、1つのシードPDB PDB$SEED
も含まれています 。このシードPDBは、CDBが新しいPDBを作成するために使用できるシステム提供のテンプレートです。 PDBは、コンテナー以外の環境で使用するものと同じデータベースです。バージョン12cで、オラクルはこのコンテナとPDB機能を導入しました。これにより、ビジネス要件に基づいてPDBを追加できます。たとえば、販売アプリケーションの営業部門データとHRアプリケーションの人材(HR)部門データを含むPDBデータベースを作成できます。
PDBのプラグを抜くということは、PDBデータベースをソースCDBから切り離し、ターゲットCDBに接続することを意味します。
このブログでは、ソースCDB、TEST12
、2つのPDB、PDB1
があります およびPDB2
。ターゲットCDB、DEV12
、プラグが抜かれたPDBを受け取ります。
PDBサンプルのプラグを抜き差し
このセクションでは、PDB1
のプラグを抜く方法を学びます およびPDB2
ソースCDBからTEST12
それらをターゲットCDBDEV12
に接続します 。
変更を加える前は、ソースPDBはMOUNTED
です。 次の画像に示すように:
プラグ操作を開始する前に、プラグインするPDBが新しいホストCDBと互換性があることを確認してください。互換性がない場合、次のPL/SQLブロックを実行するとエラーが発生します。
. oraenv
[enter dev12 at the prompt]
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を閉じます
次のSQL*Plus®ステートメントを実行してプラグを抜くことができるように、PDBを閉じます。
. oraenv
[enter test12 at the prompt]
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');
[you will see no rows]
exit
PDBをプラグインします
COPYメソッド、NOCOPYメソッド、またはCLONE MOVEメソッドのいずれかを使用して、PDBをターゲットCDBにプラグインできます。
COPYメソッドでプラグイン
COPYメソッドを使用してPDBをプラグインするには、新しいデータファイルの宛先を作成および定義し、プラグを抜いたPDBをターゲットCDBにプラグインしてから、プラグを抜いたPDBのデータファイルをコピーします。
次のコマンドを実行して、宛先ディレクトリを作成します。
mkdir /home/oracle/app/oradata/DEV12/pdb1
sqlplus / as sysdba
プラグを抜いたPDBのデータファイルを使用して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';
List the data files of the plugged PDB.
select name from v$datafile where con_id=3;
exit
これらの操作の結果を次の画像に示します。
NOCOPYメソッドでプラグイン
この方法では、プラグを抜いたPDBのデータファイルを使用して、コピーを作成または使用せずにPDBをターゲットCDBにプラグインします。
NOCOPYメソッドを使用してPDBをプラグインするには、次のコマンドを実行します。
create pluggable database pdb_plug_nocopy using '/home/oracle/app/oradata/pdb2/pdb2.xml'
NOCOPY
TEMPFILE REUSE;
この操作には数秒かかります。アンプラグされたPDBの元のデータファイルは、新しいホストCDBの新しいプラグインされたPDBに属します。 XMLファイルで指定された一時ファイルと同じ名前のファイルがターゲットの場所に存在するため、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
CLONEMOVEメソッドを使用してプラグイン
CLONE MOVEメソッドを使用してPDBをプラグインするには、新しいデータファイルの宛先を作成および定義し、プラグを抜いた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を開いてプラグ操作を完了するには、次のコマンドを実行します。
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
[enter dev12 at the prompt]
sqlplus / as sysdba
alter pluggable database all close immediate;
pdb_plug_copy
のプラグを抜きます データベースを使用してpdb1
を再作成できるようにします 次のコマンドを実行してデータベースを作成します:
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;
pdb_plug_nocopy
のプラグを抜いてドロップします データベースを使用してpdb2
を再作成できるようにします 次のコマンドを実行してデータベースを作成します。
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データベースにパッチを1回で適用できますが、コンテナ以外の環境では、すべてのデータベースに個別にパッチを適用する必要があります。コンテナおよびPDB環境では、バックアップやその他のメンテナンスタスクがはるかに簡単です。 1つ以上のファイルを誤って転送することを忘れることができないため、サーバー間で転送する単一のファイルを使用する方が簡単です。
うまくいけば、このブログは、バージョン12cのPDBと、コンテナー以外のデータベースに対するCDBの利点についてのより良いアイデアを提供してくれました。
[フィードバック]タブを使用して、コメントを書き込んだり、質問したりします。
データベースサービスの詳細をご覧ください。
-
Database-as-a-Serviceの長所と短所
元々は2017年12月7日にObjectRocket.com/blogで公開されました 多くの企業は、特定の機能を外部委託するか、社内で行うかを決定する際に躊躇します。 Database-as-a-Service(DBaaS)を検討することは、何をすべきかを決定するのに問題が生じる可能性がある状況の1つです。 多くの企業(特に技術系企業)が最初に直面する問題は、特定の機能を外部委託するのか、それとも社内で行うのかということです。自分の乗組員を雇ったり、他の会社にお金を払って物事を成し遂げるのは費用がかかるように思われるため、この決定を下すのは難しい場合があります。 ただし、データベー
-
OracleSQLプロファイルとベースライン
この投稿では、SQLプロファイルとOracle®のベースラインの違いに焦点を当て、クエリを調整するときにどのように機能するかを説明します。 オプティマイザー、プロファイル、およびベースライン 大まかに言うと、これら3つの要素は次のように連携して機能します。 クエリオプティマイザは、システム統計、バインド変数、コンパイルなどの情報を使用して、クエリ実行の最適なプランを取得します。ただし、入力の欠陥が最適ではない計画につながる場合があります。 SQLプロファイルには、この問題を軽減する補助情報が含まれています。SQLプロファイルは、これらの間違いを最小限に抑え、オプティマイザーが最適