Oracle 12.2新增了Refreshable PDB的特性,在18c中可以互换Refreshable PDB和源PDB的角色,称为Refreshable PDB Switchover。
源数据库:ORCLCDB,带1个PDB: orclpdb1
目标数据库:ORCLCDB2,无PDB
源和目标数据库可位于不同的服务器,本例为同一服务器,版本均为19c
版本均为18c或以上。
Refreshable PDB为Exadata特性,本例使用了变通的方法:
alter system set "_exadata_feature_on"=true scope=spfile;
shutdown immediate;
startup;
show parameter exadata
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_exadata_feature_on boolean TRUE
两个数据库实例均需开启归档,此略。
两个数据库均需启用local undo,此略。
两个数据库均需建立指向对方的Database Link,首先在两个数据库中均执行以下脚本以建立克隆用户:
create user c##clone_admin identified by Welcome1;
grant create session, resource to c##clone_admin container=all;
grant create pluggable database to c##clone_admin container=all;
grant sysoper to c##clone_admin container=all;
alter user c##clone_admin set container_data=ALL container=current;
grant select on cdb_pdbs to c##clone_admin;
然后在目标数据库中:
create public database link clone_link connect to c##clone_admin identified by Welcome1 using 'ORCLCDB';
Database link created.
然后在源数据库中:
ORCLCDB> create public database link clone_link connect to c##clone_admin identified by Welcome1 using 'orclcdb2';
Database link created.
在目标数据库实例上创建一Refreshable PDB,并置于只读状态:
ORCLCDB2> CREATE PLUGGABLE DATABASE orclpdb2 FROM orclpdb1@clone_link FILE_NAME_CONVERT=('ORCLPDB1', 'ORCLPDB2') REFRESH MODE MANUAL;
Pluggable database created.
ORCLCDB2> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB2 MOUNTED
ORCLCDB2> ALTER PLUGGABLE DATABASE orclpdb2 OPEN READ ONLY;
Pluggable database altered.
ORCLCDB2> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB2 READ ONLY NO
ORCLCDB2> SELECT pdb_id, pdb_name, refresh_mode, refresh_interval FROM dba_pdbs;
PDB_ID PDB_NAME REFRES REFRESH_INTERVAL
---------- ---------- ------ ----------------
2 PDB$SEED NONE
3 ORCLPDB2 MANUAL
在源数据库中,交换角色:
ORCLCDB> ALTER SESSION SET CONTAINER = orclpdb1;
Session altered.
ORCLCDB> ALTER PLUGGABLE DATABASE REFRESH MODE MANUAL FROM orclpdb2@clone_link SWITCHOVER;
Pluggable database altered.
ORCLCDB> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 ORCLPDB1 MOUNTED
ORCLCDB> ALTER PLUGGABLE DATABASE OPEN READ ONLY;
Pluggable database altered.
ORCLCDB> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 ORCLPDB1 READ ONLY NO
此时在目标数据库中,数据库已变为可写,而且是非刷新状态:
ORCLCDB2> SELECT pdb_id, pdb_name, refresh_mode, refresh_interval FROM dba_pdbs;
PDB_ID PDB_NAME REFRES REFRESH_INTERVAL
---------- ---------- ------ ----------------
2 PDB$SEED NONE
3 ORCLPDB2 NONE
ORCLCDB2> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB2 READ WRITE NO
而源数据库则变为可刷新状态,并为只读:
ORCLCDB> SELECT pdb_id, pdb_name, refresh_mode, refresh_interval FROM dba_pdbs;
PDB_ID PDB_NAME REFRES REFRESH_INTERVAL
---------- ---------- ------ ----------------
3 ORCLPDB1 MANUAL
ORCLCDB> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 ORCLPDB1 READ ONLY NO
回切和切换类似,此不赘述。
Refreshable PDB Switchover和Data Guard不同,有可能会有数据丢失。不过也可以用于灾备。