原文鏈接:https://blog.dbi-services.com/managing-refreshable-clone-pluggable-databases-with-oracle-21c/
原文作者:By Mouhamadou Diaw
可刷新的克隆 PDB 是一種刷新單個 PDB 的方法,而不是像在 Data Guard 環境中那樣刷新容器中的所有 PDB。它包括對源 PDB 進行克隆,并使用自上次應用重做日志以來累積的重做更新克隆 PDB。
在這個博客中,我做了一些關于可刷新可插拔數據庫特性的測試。
我正在使用 Oracle 21c 進行測試,但此功能自 Oracle 12.2 以來就存在。
我在下面使用的配置

一個 Oracle 21c 源 CDB:帶有源可插入數據庫 PDB1的 DB21
一個 Oracle 21c 目標 CDB:TEST21,它將包含 PDB1 的可刷新克隆。克隆將命名為 PDB1FRES
請注意,可刷新克隆可以在同一個容器中創建。
第一步是在源CDB DB21中創建一個用于數據庫鏈接的用戶
SQL> create user c##clone_user identified by rootroot2016 temporary tablespace temp container=ALL;
User created.
SQL>
SQL> grant create session, create pluggable database, sysoper to c##clone_user container=ALL ;
Grant succeeded.
SQL>
在目標CDB TEST21中,讓我們創建一個到源CDB的database link。 我們將使用用戶c##克隆
SQL> create database link clonesource connect to c##clone_user identified by rootroot2016 using 'DB21';
Database link created.
SQL>
SQL> select * from dual@clonesource;
D
-
X
SQL>
現在,我們可以在數據庫TEST21中創建PDB1的可刷新克隆PDB1FRES。
首先,我們將創建一個手動可刷新克隆
SQL> create pluggable database PDB1FRES from PDB1@clonesource refresh mode manual;
Pluggable database created.
SQL>
創建后,新克隆的database是mounted狀態
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES MOUNTED
SQL>
我們可以看到刷新模式
SQL> select PDB_NAME,REFRESH_MODE,REFRESH_INTERVAL,LAST_REFRESH_SCN from dba_pdbs where PDB_NAME='PDB1FRES';
PDB_NAME REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
--------------- ------ ---------------- ----------------
PDB1FRES MANUAL 39266271
SQL>
好了,現在讓我們對PDB1做一些更改,看看如何在PDB1FRES上傳這些更改
SQL> show con_name
CON_NAME
------------------------------
PDB1
SQL> create table test(id number);
Table created.
SQL> insert into test values (1);
1 row created.
SQL> commit;
Commit complete.
SQL>
必須關閉(mounted)PDB1FRES,以便對PDB1中的更改進行刷新。 由于在創建過程中使用了子句REFRESH MANUAL,所以我們必須手動執行刷新
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter pluggable database PDB1FRES refresh;
Pluggable database altered.
SQL>
現在,我們以只讀模式打開PDB1FRES,以驗證刷新
SQL> alter pluggable database PDB1FRES open read only;
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES MOUNTED
SQL> alter pluggable database PDB1FRES open read only;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES READ ONLY NO
SQL> alter session set container=PDB1FRES;
Session altered.
SQL> select * from test;
ID
----------
1
SQL>
SQL> alter pluggable database PDB1FRES close immediate;
Pluggable database altered.
可以看到,手動刷新工作正常。
我們可以把手動刷新模式改成自動刷新模式嗎?
讓我們試試看.
SQL> alter pluggable database PDB1FRES refresh mode every 4 minutes;
Pluggable database altered.
SQL> select PDB_NAME,REFRESH_MODE,REFRESH_INTERVAL,LAST_REFRESH_SCN from dba_pdbs where PDB_NAME='PDB1FRES';
PDB_NAME REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
--------------- ------ ---------------- ----------------
PDB1FRES AUTO 4 39272240
SQL>
現在讓我們再次對PDB1進行一些更改
SQL> insert into test values (10);
1 row created.
SQL> insert into test values (20);
1 row created.
SQL> commit;
Commit complete.
SQL>
4分鐘后,我們可以看到PDB1FRES上最后一個LAST_REFRESH_SCN發生了更改
SQL> select PDB_NAME,REFRESH_MODE,REFRESH_INTERVAL,LAST_REFRESH_SCN from dba_pdbs where PDB_NAME='PDB1FRES';
PDB_NAME REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
--------------- ------ ---------------- ----------------
PDB1FRES AUTO 4 39272403
SQL>
讓我們以只讀模式打開PDB1FRES,并驗證是否復制了最新的更改
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES READ ONLY NO
SQL> alter session set container=PDB1FRES ;
Session altered.
SQL> select * from test;
ID
----------
1
10
20
SQL>
注意,PDB克隆只有mounted,自動刷新才會成功。 還要注意,即使配置了自動刷新,也可以執行手動刷新。
另一個問題可能是,我們是否可以以讀寫模式打開PDB1FRES。
讓我們試試看
SQL> alter pluggable database PDB1FRES open read write;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES READ ONLY NO
SQL>
什么? open read write命令返回SUCCESS,但數據庫在只讀模式下是真正的openend。
要以讀寫模式打開數據庫,必須將刷新模式設置為none。
SQL> alter pluggable database PDB1FRES refresh mode none;
alter pluggable database PDB1FRES refresh mode none
*
ERROR at line 1:
ORA-65025: Pluggable database PDB1FRES is not closed on all instances.
SQL> alter pluggable database PDB1FRES close immediate;
Pluggable database altered.
SQL> alter pluggable database PDB1FRES refresh mode none;
Pluggable database altered.
SQL> col pdb_name for a15
SQL> select PDB_NAME,REFRESH_MODE,REFRESH_INTERVAL,LAST_REFRESH_SCN from dba_pdbs where PDB_NAME='PDB1FRES';
PDB_NAME REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
--------------- ------ ---------------- ----------------
PDB1FRES NONE 39272683
SQL> alter pluggable database PDB1FRES open read write;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES READ WRITE NO
SQL>
現在PDB1FRES已以讀寫模式打開,讓我們關閉它,并嘗試以可刷新克隆的方式再次轉換它
SQL> alter pluggable database PDB1FRES close immediate;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1FRES MOUNTED
SQL> alter pluggable database PDB1FRES refresh mode manual;
alter pluggable database PDB1FRES refresh mode manual
*
ERROR at line 1:
ORA-65261: pluggable database PDB1FRES not enabled for refresh
SQL>
無法將打開的 R/W PDB 轉換回可刷新的 PDB。文檔中明確指定了
您不能將普通 PDB 更改為可刷新的克隆 PDB。可刷新克隆 PDB 轉換為普通 PDB 后,您無法將其改回可刷新克隆 PDB。
結論
可刷新 PDB 的一種用法是克隆可用作 PDB 級別快照的黃金主控。這些快照可用于開發人員的克隆環境。




