ORACLE 18C PDB REFRESH
- PDB REFRESH介绍
Oracle Database 12.2引入可刷新克隆pdb,这样我们可以快速创建生产环境的开发环境以及测试环境也创建单个pdb容灾,无需像adg一样需要整个库进行容灾,从而使特定pdb容灾更加简单与方便,ORACLE 18C支持源端pdb与目标refresh pdb进行switchover,使得pdb切换具备oracle adg切换一样灵活与方便.pdb refresh只是创建pdb众多方式中一种.
- PDB REFRESH注意事项(目前处于测试阶段,翻阅了部分资料,欢迎指正)
如果PDB被Clone的到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。
源端与目标端的字节顺序必须相同。
连接的用户在CDB中必须拥有'Create Pluggable Database'的权限。
如果需要进行switchover,2边dblink的用户名与密码必须相同。
需要在cdb级别创建dblink,pdb通过dblink来刷新以及switchover。
源PDB不可以是关闭状态。
源端PDB必须为归档模式。
源端PDB必须是local undo模式。
在Refreshable PDB创建后,如果源端需要创建相应表空间,那么目标端需要配置PDB_FILE_NAME_CONVERT参数或使用OMF目录管理方式(OMF级别高PDB_FILE_NAME_CONVERT),否正会导致目标端PDB刷新失败。
目标端采用OMF目录管理方式后,Create Pluggable Database子句中不能指定file_name_convert做显示目录转换,否正报ORA-01276错误。
在使用刷新目标PDB与源PDB同步数据时,是通过dblink从源PDB访问redo,但有些时候,当需要更新刷新副本时,源PDB或源PDB所属的CDB可能无法访问,在这种情况下,设置REMOTE_RECOVERY_FILE_DEST参数,将尝试从此参数指定的目录中读取归档日志文件。
刷新与切换命令均需在目标PDB中执行。
无论手动或自动刷新,目标库PDB必须处于MOUNT状态,不可以处于以READ ONLY 打开的状态。
- PDB 刷新模式
1、手动刷新(Manual Refresh)
2、自动刷新(Auto Refresh)
- Refresh PDB 工作方式
1、如果源端pdb数据库容量很大,refresh pdb需要持续较长时间,这个需要根据网络带宽、数据库IO以及目标IO等依赖关系
2、在使用刷新目标PDB与源PDB同步数据时,是通过dblink从源PDB访问redo,但有些时候,当需要更新刷新副本时,源PDB或源PDB所属的CDB可能无法访问,在这种情况下,设置REMOTE_RECOVERY_FILE_DEST参数,将尝试从此参数指定的目录中读取归档日志文件。
- Refresh PDB实施
源端创建相关用户及DBLINK
---在CDB级创建用户
create user c##remote_clone_user identified by remote_clone_user container=all;
---授予创建会话,ANY TABLE,UNLIMITED TABLESPACE 等权限
grant create session, resource, create any table, unlimited tablespace to c##remote_clone_user container=all;
---授予创建PDB权限
grant create pluggable database to c##remote_clone_user container=all;
---授予SYSOPER权限
grant sysoper to c##remote_clone_user container=all;
---在CDB级创建DBLINK,USING使用的TNS的SERVICE_NAME为CDB的监听的SERVER名
create database link clone_link connect to c##remote_clone_user identified by remote_clone_user using 'refdb';
---测试DBLINK是否联通
select count(*) from dual@clone_link;
---TNS配置,根据实际进行更改
[TNS_NAME] =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.x.x)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = [CDB_SERVER_NAME])
)
)
源端创建相关用户及DBLINK
目标端建议配置与源端同样的USER及DBLINK_NAME,这样便于进行SWITCHOVER操作。步骤同主库。
检查omf是否设置
show parameter db_create_file_dest
如果存在则不需要进行 alter system set db_create_file_dest=xx;操作
PS:在Refreshable PDB创建后,如果源端需要创建相应表空间,那么目标端需要配置PDB_FILE_NAME_CONVERT参数或使用OMF目录管理方式(OMF级别高PDB_FILE_NAME_CONVERT),否正会导致目标端PDB刷新失败。
---源端查看PDB
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
1 RED READ WRITE NO
2 RED1 READ WRITE NO
3 RED2 READ WRITE NO
4 RED3 READ WRITE NO
5 RED4 READ WRITE NO
---手动在目标端通过手动REFRESH创建备库(首次创建必须要进行手动刷新)
CREATE PLUGGABLE DATABASE redc FROM red@clone_link REFRESH MODE MANUAL;
CREATE PLUGGABLE DATABASE redc1 FROM red@clone_link REFRESH MODE MANUAL;
CREATE PLUGGABLE DATABASE redc2 FROM red@clone_link REFRESH MODE MANUAL;
CREATE PLUGGABLE DATABASE redc3 FROM red@clone_link REFRESH MODE MANUAL;
CREATE PLUGGABLE DATABASE redc4 FROM red@clone_link REFRESH MODE MANUAL;
---目标端创建完成后,查看PDB,状态,刷新模式,已经创建完成,并处于MOUNT状态
SQL> select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ---------- ---------- ------ ----------------
3 PDB NORMAL NONE
2 PDB$SEED NORMAL NONE
5 REDC1 REFRESHING MANUAL
4 REDC REFRESHING MANUAL
6 REDC2 REFRESHING MANUAL
7 REDC3 REFRESHING MANUAL
8 REDC4 REFRESHING MANUAL
7 rows selected.
Elapsed: 00:00:00.00
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB MOUNTED
4 REDC MOUNTED
5 REDC1 MOUNTED
6 REDC2 MOUNTED
7 REDC3 MOUNTED
8 REDC4 MOUNTED
- 测试DML是否可以同步(Manual Refresh)
---源库创建并查看测试表体积及记录行数
PDB_NAME OWNER SEGMENT_NAME MB NUM_ROWS
-------- ------------ -------------------- ---------- ----------
RED SYS REF_TB 9536 160000000
RED1 SYS REF_TB 14944 256000000
RED2 SYS REF_TB 14961 256000000
RED3 SYS REF_TB 14961 256000000
RED4 SYS REF_TB 14961 256000000
---源库、目标库均可以使用如下SQL进行查询
set line 300
col segment_name for a20
col owner for a20
select s.owner,s.segment_name,s.bytes/1024/1024 as "MB",t.num_rows
from dba_segments s,dba_tables t
where s.segment_name = t.table_name
and s.segment_name = 'REF_TB';
---目标库在进行同步时,必须处于MOUNT状态,如需验证数据,需要将数据库打开(只能以READ ONLY模式打开),如过是RAC模式,需要加上INSTANCES=ALL参数,否则只会在单个实例生效。
---单独打开某个PDB
alter pluggable database [PDB_NAME] open read only;
---打开所有PDB
alter pluggable database all open read only;
---进入PDB,查看表是否同步以及体积、行数
alter session set container=[PDB_NAME];
set line 300
col segment_name for a20
col owner for a20
select s.owner,s.segment_name,s.bytes/1024/1024 as "MB",t.num_rows
from dba_segments s,dba_tables t
where s.segment_name = t.table_name
and s.segment_name = 'REF_TB';
- 自动刷新(Auto Refresh)
---将PDB更改为自动刷新,刷新间隔为1分钟(必须在MOUNT状态下更改)
ALTER PLUGGABLE DATABASE [PDB_NAME] CLOSE;
ALTER PLUGGABLE DATABASE ALL CLOSE;
ALTER PLUGGABLE DATABASE redc REFRESH MODE EVERY 1 MINUTES;
ALTER PLUGGABLE DATABASE redc1 REFRESH MODE EVERY 1 MINUTES;
ALTER PLUGGABLE DATABASE redc2 REFRESH MODE EVERY 1 MINUTES;
ALTER PLUGGABLE DATABASE redc3 REFRESH MODE EVERY 1 MINUTES;
ALTER PLUGGABLE DATABASE redc4 REFRESH MODE EVERY 1 MINUTES;
---在ALERT日志中看到,PDB间隔1分钟,在进行PDB刷新,实际上则在执行手动REFRESH的命令
2019-11-20T11:08:13.998312+08:00
REDC(4):alter pluggable database refresh
REDC(4):Completed: alter pluggable database refresh
2019-11-20T11:09:00.193416+08:00
REDC4(8):alter pluggable database refresh
REDC4(8):Completed: alter pluggable database refresh
REDC3(7):alter pluggable database refresh
REDC3(7):Completed: alter pluggable database refresh
REDC1(5):alter pluggable database refresh
REDC1(5):Completed: alter pluggable database refresh
2019-11-20T11:09:14.037151+08:00
REDC(4):alter pluggable database refresh
REDC(4):Completed: alter pluggable database refresh
大家还可以测试一下DATAFILE等刷新机制,需要注意OMF和PDB_FILE_NAME_CONVERT参数