##はじめに
停止できないDBをある断面にて複製し、定期的に差分を反映させたい要件があったためOracle Database 12.2の新機能であるリフレッシュ可能PDBのホットクローンによる作成手順を確認しました。
その際の備忘メモです。ローカルCDB内にてPDBをクローンしてます。
18c新機能であるPDBスナップショット・カルーセルは動作するエディションに制限(Exadata等エンジニアドシステムかクラウドのみ動作)があったため、ホットクローンにしました。
参考:Oracle Database製品で許可される機能、オプションおよびManagement Pack
##PDBホットクローンとは
クローン元のPDBが READ/WRITE状態のままクローンPDBを作成することができる機能です。
ホットクローン作成後も手動または自動でクローン元の更新分をクローン先に反映させることが可能です。以下のような用途で使えます。
出典:Oracle Database 12.2 CoreTech Seminer Multitenant
##リフレッシュ可能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