Oracle Database 12cR1 マルチテナント・アーキテクチャ環境でのお勉強
概要
PDBをCDBからアンプラグして、別のCDBにプラグする。
環境
macOS 10.12 Sierra
Oracle VM VirtualBox 5.1.20 Mac OS X (64-bit)
Oracle Linux 7 Update x86-64
Oracle Database 12c Release 1 (12.1.0.2)
プラガブル・データベース(PDB)のアンプラグ
PDBをアンプラグするCDBの事前確認
接続先DBの確認
SQL> col name for a10
SQL> SELECT name FROM v$database;
NAME
----------
CDB
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDB1 READ WRITE
PDB2 READ WRITE
PDBをアンプラグ
12cR1では、アンプラグ時にPDBをクローズしていない場合、下記のエラーが出力される。
12cR2ではオンラインでの対応が可能である模様。
SQL> ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml';
ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml'
*
行1でエラーが発生しました。:
ORA-65025:
プラガブル・データベースPDB1はすべてのインスタンスでクローズしていません。
PDB1をクローズする。
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;
プラガブル・データベースが変更されました。
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 READ WRITE
PDB1をアンプラグする。
SQL> ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml';
プラガブル・データベースが変更されました。
PDBアンプラグ後の状態について
PDBをアンプラグすると、プラグイン定義用XMLファイルが生成される。
SQL> !locate PDB1.xml
/u01/app/oracle/product/12.1.0/dbhome_1/dbs/PDB1.xml
また、PDBを削除するまで定義情報は存在する。
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 READ WRITE
SQL> col pdb_name for a10
SQL> SELECT pdb_name, status FROM cdb_pdbs;
PDB_NAME STATUS
---------- ---------------------------
PDB$SEED NORMAL
PDB1 UNPLUGGED
PDB2 NORMAL
PDBを削除
SQL> DROP PLUGGABLE DATABASE pdb1 KEEP DATAFILES;
プラガブル・データベースが削除されました。
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDB2 READ WRITE
SQL> SELECT pdb_name, status FROM cdb_pdbs;
PDB_NAME STATUS
---------- ---------------------------
PDB$SEED NORMAL
PDB2 NORMAL
プラガブル・データベース(PDB)のプラグ
PDBをプラグするCDBの事前確認
SQL> col name for a10
SQL> SELECT name FROM v$database;
NAME
----------
CDB2
SQL> col pdb_name for a10
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDBがCDBと互換性があるか確認
DBMS_PDB.CHECK_PLUG_COMPATIBILITYを使用することで、互換性を確認できる。
https://docs.oracle.com/cd/E49329_01/server.121/b71301/cdb_plug.htm#CEGJBJJE
SQL> SET SERVEROUTPUT ON
DECLARE
compatible CONSTANT VARCHAR2(3) :=
CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/PDB1.xml',
pdb_name => 'PDB1')
WHEN TRUE THEN 'YES'
ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/SQL> 2 3 4 5 6 7 8 9 10 11 12
YES
PL/SQLプロシージャが正常に完了しました。
出力がNOの場合はPDBに互換性がなく、PDB_PLUG_IN_VIOLATIONSビューにレコードが生成される。
SQL> SELECT message, action FROM pdb_plug_in_violations WHERE name='PDB1';
レコードが選択されませんでした。
今回は問題なかったため、レコードは生成されなかった。
PDBをプラグ
SQL> CREATE PLUGGABLE DATABASE pdb1 USING 'PDB1.xml' NOCOPY;
プラガブル・データベースが作成されました。
PDBをオープン
SQL> ALTER PLUGGABLE DATABASE pdb1 OPEN;
プラガブル・データベースが変更されました。
SQL> SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
---------- ------------------------------
PDB$SEED READ ONLY
PDB1 READ WRITE
SQL> SELECT pdb_name, status FROM cdb_pdbs;
PDB_NAME STATUS
---------- ---------------------------
PDB$SEED NORMAL
PDB1 NORMAL
PDBをCDBからアンプラグして、別のCDBにプラグできることを確認できた。