原文链接: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 级别快照的黄金主控。这些快照可用于开发人员的克隆环境。