Oracle12cR1 プラガブル・データベース(PDB)のUnplug/Plug

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の確認

```splus
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ではオンラインでの対応が可能である模様。

```splus
SQL> ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml';
ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml'
*
行1でエラーが発生しました。:
ORA-65025:
プラガブル・データベースPDB1はすべてのインスタンスでクローズしていません。
```
PDB1をクローズする。

```splus
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をアンプラグする。

```splus
SQL> ALTER PLUGGABLE DATABASE pdb1 UNPLUG INTO 'PDB1.xml';

プラガブル・データベースが変更されました。
```

##PDBアンプラグ後の状態について

PDBをアンプラグすると、プラグイン定義用XMLファイルが生成される。

```splus
SQL> !locate PDB1.xml
/u01/app/oracle/product/12.1.0/dbhome_1/dbs/PDB1.xml
```

また、PDBを削除するまで定義情報は存在する。

```splus
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を削除

```splus
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の事前確認

```splus
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

```splus
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ビューにレコードが生成される。

```splus
SQL> SELECT message, action FROM pdb_plug_in_violations WHERE name='PDB1';

レコードが選択されませんでした。
```

今回は問題なかったため、レコードは生成されなかった。

##PDBをプラグ

```splus
SQL> CREATE PLUGGABLE DATABASE pdb1 USING 'PDB1.xml' NOCOPY;

プラガブル・データベースが作成されました。
```

##PDBをオープン

```splus
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にプラグできることを確認できた。