[Oracle DB] ホットクローンでリフレッシュ可能PDBを作成する手順

##はじめに
停止できないDBをある断面にて複製し、定期的に差分を反映させたい要件があったためOracle Database 12.2の新機能であるリフレッシュ可能PDBのホットクローンによる作成手順を確認しました。

その際の備忘メモです。ローカルCDB内にてPDBをクローンしてます。
18c新機能であるPDBスナップショット・カルーセルは動作するエディションに制限（Exadata等エンジニアドシステムかクラウドのみ動作）があったため、ホットクローンにしました。

参考：[Oracle Database製品で許可される機能、オプションおよびManagement Pack](https://docs.oracle.com/cd/F19136_01/dblic/Licensing-Information.html#GUID-0F9EB85D-4610-4EDF-89C2-4916A0E7AC87)


##PDBホットクローンとは
クローン元のPDBが READ/WRITE状態のままクローンPDBを作成することができる機能です。
ホットクローン作成後も手動または自動でクローン元の更新分をクローン先に反映させることが可能です。以下のような用途で使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120705/437e4927-8cec-83cc-4cee-d7b45db8f8be.png)
出典：[Oracle Database 12.2 CoreTech Seminer Multitenant](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120705/6f065e0a-77a4-1da4-4de8-6422489cf27b.png)
)

##リフレッシュ可能PDBとは
ソースPDBの変更を反映させることができるPDBです。PDBをクローニングする際に `REFRESH MODE` 句を指定することで設定できます。差分を任意のタイミングで手動で反映させることも、定期的に10分間隔等で反映させることも可能です。

##実施手順
###確認環境
- Oracle Cloud Infrastructure (OCI)上に作成した Oracle Database 19.4 Enterprise Edition High Performance

###ホットクローンの前提条件
- CDBがARCHIVELOGモードおよびローカルUNDOモード

###手順

ホットクローン対象のPDBがREAD/WRITEであることを確認。

```
[oracle@db01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 12 03:28:51 2019
Version 19.4.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.4.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB01                          READ WRITE NO ★←read/write
```

PDB側のsystemユーザーに"create pluggable database"権限を付与。

```
SQL> grant create pluggable database to system container=all;

Grant succeeded.
```

クローン元のPDBにアクセスするDBリンクを作成。

```
SQL> create public database link link_to1 connect to system identified by xxx using 'PDB01';

Database link created.
```

リフレッシュ可能PDBをホットクローンで作成。Oracle Cloudはデフォルトで表領域暗号化されているため、"keystore"句でパスワードを入力しています。このコマンドによりPDBのデータファイルが複製されます。

```
SQL> create pluggable database pdb02 from pdb01@link_to1 keystore identified by xxx refresh mode every 3 minutes;

Pluggable database created.
```

以下、ホットクローン実行時のメッセージ。アラートログより抜粋。

```
PDB02(4):Endian type of dictionary set to little
\****************************************************************
Pluggable Database PDB02 with pdb id - 4 is created as UNUSABLE.
If any errors are encountered before the pdb is marked as NEW,
then the pdb must be dropped
local undo-1, localundoscn-0x000000000000012c
\****************************************************************
（略）
```

ホットクローン実行後は "MOUNTED" でPDBが作成されています。

```
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB01                          READ WRITE NO
         4 PDB02                          MOUNTED ★←ホットクローンで作成したPDB
```


以下は自動リフレッシュ時のメッセージ。アラートログより抜粋。内部で `alter pluggable database refresh` が実行されています。更新差分はDataGuardのスタンバイ機のようにリカバリされていることが分かります。

```
2019-12-12T05:35:14.601356+00:00
PDB02(4):alter pluggable database refresh
・・・
PDB02(4):Media Recovery Start
・・・
PDB02(4):Media Recovery Complete (cdb01)
・・・
PDB02(4):Completed: alter pluggable database refresh
```

リフレッシュ可能PDBを起動する際はリフレッシュモードを停止する必要があります。一度リフレッシュモードを停止すると再度リフレッシュモードにすることはできません。

```
SQL> alter pluggable database pdb02 open;
alter pluggable database pdb02 open
*
ERROR at line 1:
ORA-65341: cannot open pluggable database in read/write mode
★↑リフレッシュ可能PDBのためopen不可

SQL> alter pluggable database pdb02 refresh mode none;

Pluggable database altered.
★↑リフレッシュモードを停止

SQL> alter pluggable database pdb02 open;

Pluggable database altered.
★↑リフレッシュモードを停止するとOPENできることを確認
```

###直面したエラー
#####DBリンクがない場合
リフレッシュ可能PDBの場合はDBリンクが必要。

```
SQL> create pluggable database pdb03 from pdb01 keystore identified by WElcome##01 refresh mode every 3 minutes;
create pluggable database pdb03 from pdb01 keystore identified by WElcome##01 refresh mode every 3 minutes
                                                                                           *
ERROR at line 1:
ORA-00922: missing or invalid option
```


#####PDB側のユーザーに"create pluggable database"権限がない場合

```
SQL> create pluggable database pdb02 from pdb01@link_to1 keystore identified by WElcome##01 refresh mode every 3 minutes;
create pluggable database pdb02 from pdb01@link_to1 keystore identified by WElcome##01 refresh mode every 3 minutes
*
ERROR at line 1:
ORA-17628: Oracle error 1031 returned by remote Oracle server
ORA-01031: insufficient privileges
```

#####DBリンクを"sys"で張った場合

```
SQL> create public database link link_to1 connect to sys identified by WElcome##01 using 'PDB01';

Database link created.

SQL> create pluggable database pdb02 from pdb01@link_to1 keystore identified by WElcome##01 refresh mode every 3 minutes;
create pluggable database pdb02 from pdb01@link_to1 keystore identified by WElcome##01 refresh mode every 3 minutes
*
ERROR at line 1:
ORA-17627: ORA-28009: connection as SYS should be as SYSDBA or SYSOPER
ORA-17629: Cannot connect to the remote database server
```

##リファレンス
[Oracle Database 19c SQL言語リファレンス - CREATE PLUGGABLE DATABASE](https://docs.oracle.com/cd/F19136_01/sqlrf/CREATE-PLUGGABLE-DATABASE.html#GUID-F2DBA8DD-EEA8-4BB7-A07F-78DC04DB1FFC)