1、Refresh MODE语句数据库
在使用Create Pluggable Database建立PDB时指定Refresh MODE子句用来控制是否开启刷新机制。c#
该子句目前只在”Create Pluggable Database… From”中支持,能够使用此语句指定以下选项:session
指定Refresh MODE NONE,这是默认方式,在建立PDB时不开启刷机机制。oracle
指定Refresh MODE MANUAL子句,建立手动刷新的PDB。app
指定Refresh MODE EVERY number_of_minutes MINUTES子句,建立以周期性刷新的PDB。ide
另外值得一提的是Oracle 18c对Refreshable PDB进行了进一步的加强,加强为Refreshable PDB Switchover(可刷新PDB的切换),在12.2.1中源PDB只能做为源端PDB,而在18c中可对源PDB和目标PDB进行角色转换,该功能相似Active Dataguard的主备切换,只不过Oracle在PDB Refresh中再次实现了该功能。测试
目前Refreshable PDB只能在只读模式下打开,当Refreshable PDB进行刷新时,Refreshable PDB必须处于关闭状态,只读模式打开时会中止刷新,当再次关闭Refreshable PDB时继续上次的刷新,也能够将Refreshable PDB更改成Refresh MODE NONE模式,更改以后你没法在将PDB改成Refreshable PDB。spa
另外也能够使用Alter Pluggable Database命令将Refreshable PDB从手动刷新更改成自动刷新,也能够从自动刷新更改成手动刷新,一样经过语句Alter Pluggable Database +Refresh MODE更改成非Refreshable PDB,可是非Refreshable PDB不能够被更改成Refreshable PDB。日志
同时须要注意的是,Source PDB和Refreshable PDB能够属于同一个CDB, 也能够属于不一样的 CDB,可是 在建立Refreshable PDB时必须指定DBlink,DBlink指向本身所在的CDB,不然语法没法经过。orm
Refreshable PDB的应用场景能够用在开发和测试环境的搭建过程当中, 由于数据是采用增量同步的方式,这样就减小了对源数据库的影响,也能够做为online备份库。
Clone源端的PDB前期注意事项:
若是PDB被Clone的到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。
源端与目标端的字节顺序必须相同。
链接的用户在CDB中必须拥有’Create Pluggable Database’的权限。
源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中执行。
2、PDB Refreshcesh
以下将源端PDB:woqupdb经过refresh方式克隆到本地,且命名为qdatapdb。
(1)建立目标端到源端库的DBLINK:orcl12c
sys. ora12c>CREATE DATABASE LINK orcl12c CONNECT TO system IDENTIFIEDBY oracle USING 'orcl12c';
Database link created.
Elapsed: 00:00:00.15
sys. ora12c>
克隆源端WOQUPDB
sys. orcl12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4WOQUPDB READ WRITENO
sys. orcl12c>
(2)目标端配置OMF目录管理方式
sys. ora12c>alter system set db_create_file_dest='/u01/app/oracle/oradata';
System altered.
Elapsed: 00:00:00.04
sys. ora12c>
(3)在目标端使用CREATE PLUGGABLE DATABASE + REFRESH MODE MANUAL语句建立qdatapdb
sys. ora12c>CREATE PLUGGABLE DATABASE qdatapdb FROM woqupdb@orcl12c REFRESH MODE MANUAL;
Pluggable database created.
Elapsed: 00:00:14.20
sys. ora12c>
(4)检查克隆完成的QDATAPDB
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
sys. ora12c>select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------------------------------ ---------- ----------------------
2 PDB$SEED NORMAL NONE
4 QDATAPDB REFRESHINGMANUAL
Elapsed: 00:00:00.07
sys. ora12c>
经过视图咱们能够看到状态为REFRESHING,刷新模式为MANUAL手工刷新。
(5)在源PDB建立表空间tbs1,及测试表t
sys. orcl12c>createtablespace tbs1 datafile size 100M;
Tablespace created.
Elapsed: 00:00:00.30
sys. orcl12c>create user yyh identified by yyh;
User created.
Elapsed: 00:00:00.09
sys. orcl12c>drop user yyh ;
User dropped.
Elapsed: 00:00:01.34
sys. orcl12c>create user yyh default tablespace tbs1 identified by yyh;
User created.
Elapsed: 00:00:00.05
sys. orcl12c>grant dba to yyh;
Grant succeeded.
Elapsed: 00:00:00.04
sys. orcl12c>conn yyh/yyh@woqupdb
Connected.
yyh. woqupdb>createtable t as select * from dba_objects;
Table created.
Elapsed: 00:00:02.18
yyh. woqupdb>selectcount(*) from t;
COUNT(*)
----------
72714
Elapsed: 00:00:00.03
yyh. woqupdb>
(6)在目标端刷新QDatapdb
sys. ora12c>alterpluggable database qdatapdb refresh;
alter pluggable database qdatapdb refresh
*
ERROR at line 1:
ORA-65118: operation affecting a pluggable database cannot be performedfrom another pluggable database
Elapsed: 00:00:00.04
sys. ora12c>conn sys/oracle@qdatapdb as sysdba
Connected.
21:55:00 sys. qdatapdb>set time off
sys. qdatapdb>alterpluggable database qdatapdb refresh;
Pluggable database altered.
Elapsed: 00:00:01.84
sys. qdatapdb>
日志信息:
2018-03-10T21:55:06.187494-05:00
QDATAPDB(4):alter pluggable database qdatapdb refresh
2018-03-10T21:55:06.975492-05:00
Applying media recovery for pdb-4099 from SCN 2800296 to SCN 2802347
Remote log information: count-1
thr-1, seq-5, logfile-/u01/app/oracle/fast_recovery_area/orcl12c/ORCL12C/foreign_archivelog/WOQUPDB/2018_03_10/o1_mf_1_5_1212300924_.arc,los-2791634, nxs-18446744073709551615
QDATAPDB(4):Media Recovery Start
2018-03-10T21:55:06.977285-05:00
QDATAPDB(4):Serial Media Recovery started
2018-03-10T21:55:07.061801-05:00
QDATAPDB(4):Media Recovery Log/u01/app/oracle/fast_recovery_area/orcl12c/ORCL12C/foreign_archivelog/WOQUPDB/2018_03_10/o1_mf_1_5_1212300924_.arc
2018-03-10T21:55:07.503582-05:00
QDATAPDB(4):Successfully added datafile 51 to media recovery
QDATAPDB(4):Datafile #51:'/u01/app/oracle/oradata/ORA12C/671B0AC55A3F2870E0535138A8C0026E/datafile/o1_mf_tbs1_fb96ncby_.dbf'
2018-03-10T21:55:07.998822-05:00
QDATAPDB(4):Incomplete Recovery applied until change 2802347 time 03/10/201821:55:06
2018-03-10T21:55:08.006177-05:00
QDATAPDB(4):Media Recovery Complete (ora12c)
QDATAPDB(4):Completed: alter pluggable database qdatapdb refresh
(7)目标端打开QDatapdb, 检查刷新完成后的数据
sys. qdatapdb>alter database open read only;
Database altered.
Elapsed: 00:00:01.54
sys. qdatapdb>selectcount(*) from yyh.t;
COUNT(*)
----------
72714
Elapsed: 00:00:00.04
sys. qdatapdb>select t.name tablespace_name, d.name from v$tablespacet, v$datafile d where d.ts#=t.ts#;
TABLESPACE_NAME NAME
------------------------------------------------------------------------------------
SYSTEM /u01/app/oracle/oradata/ORA12C/671B/datafile/o1_mf_system_fbjv_.dbf
SYSAUX /u01/app/oracle/oradata/ORA12C/671B/datafile/o1_mf_sysaux_fbk6_.dbf
UNDOTBS1 /u01/app/oracle/oradata/ORA12C/671B/datafile/o1_mf_undotbs1_fbhk7_.dbf
TBS1 /u01/app/oracle/oradata/ORA12C/671B/datafile/o1_mf_tbs1_fbcby_.dbf
Elapsed: 00:00:00.01
sys. qdatapdb>
这里已经刷新完毕,数据同步到本地目标qdatapdb中。
(8)目标库修改成自动刷新模式,每分钟刷新一次
sys. qdatapdb>ALTER PLUGGABLE DATABASE qdatapdb REFRESH MODE EVERY 1 MINUTES;
Pluggable database altered.
Elapsed: 00:00:00.09
sys. qdatapdb>select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------------------------------ ---------- ----------------------
4 QDATAPDB REFRESHING AUTO 1
Elapsed: 00:00:00.05
sys. qdatapdb>
经过视图咱们能够看到刷新模式已经被更改成AUTO,间隔时间为1分钟。
(9)源PDB删除测试表
yyh. woqupdb>droptable t;
Table dropped.
Elapsed: 00:00:00.31
yyh. woqupdb>
日志:
2018-03-10T22:01:49.537240-05:00
QDATAPDB(4):ALTER PLUGGABLE DATABASE pdb1 REFRESH MODE EVERY 1 MINUTES
QDATAPDB(4):ORA-65118 signalled during: ALTER PLUGGABLE DATABASE pdb1REFRESH MODE EVERY 1 MINUTES...
2018-03-10T22:02:21.179776-05:00
QDATAPDB(4):ALTER PLUGGABLE DATABASE qdatapdb REFRESH MODE EVERY 1 MINUTES
QDATAPDB(4):Completed: ALTER PLUGGABLE DATABASE qdatapdb REFRESH MODEEVERY 1 MINUTES
2018-03-10T22:02:21.357524-05:00
QDATAPDB(4):alter pluggable database refresh
QDATAPDB(4):Completed: alter pluggable database refresh
2018-03-10T22:03:21.502428-05:00
QDATAPDB(4):alter pluggable database refresh
QDATAPDB(4):Completed: alter pluggable database refresh
2018-03-10T22:04:21.680468-05:00
QDATAPDB(4):alter pluggable database refresh
QDATAPDB(4):Completed: alter pluggable database refresh
经过日志能够观察到目标端每分钟自动刷新一次。
(10)检查目标端数据同步状况
sys. qdatapdb>selectcount(*) from yyh.t;
COUNT(*)
----------
72714
Elapsed: 00:00:00.03
sys. qdatapdb>select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY
Elapsed: 00:00:00.03
sys. qdatapdb>shutdown immediate
Pluggable Database closed.
sys. qdatapdb>
因目标库在OPEN状态下,虽然日志中显示每分钟刷新,可是数据实际并未正真同步。
(11)1分钟后再次检查数据同步状况
sys. qdatapdb>alter database open read only;
Database altered.
Elapsed: 00:00:01.89
sys. qdatapdb>selectcount(*) from yyh.t;
select count(*) from yyh.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
Elapsed: 00:00:00.01
sys. qdatapdb>
数据已经同步完成。
(12)转换为目标PDB:QDataPDB为非none PDB
sys. ora12c>select pdb_id, pdb_name, status, refresh_mode,refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------------------------------ ---------- ----------------------
2 PDB$SEED NORMAL NONE
4 QDATAPDB REFRESHINGAUTO 1
Elapsed: 00:00:00.03
sys. ora12c>alter pluggable database qdatapdb close;
Pluggable database altered.
Elapsed: 00:00:00.19
sys. ora12c>alter session set container=qdatapdb;
Session altered.
Elapsed: 00:00:00.00
sys. qdatapdb>ALTERPLUGGABLE DATABASE qdatapdb REFRESH MODE NONE;
Pluggable database altered.
Elapsed: 00:00:04.01
sys. ora12c>ALTERPLUGGABLE DATABASE qdatapdb REFRESH MODE manual;
ALTER PLUGGABLE DATABASE qdatapdb REFRESH MODE manual
*
ERROR at line 1:
ORA-65261: pluggable database QDATAPDB not enabled for refresh
Elapsed: 00:00:00.00
sys. ora12c>
Note:禁用PDB Refresh功能后,就不能再转换为Refresh PDB。
(13)检查QDataPDB状态
sys. ora12c>conn /as sysdba
Connected.
sys. ora12c>select pdb_id, pdb_name, status, refresh_mode, refresh_intervalfrom cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------------------------------ ---------- ----------------------
2 PDB$SEED NORMAL NONE
4 QDATAPDB NEW NONE
Elapsed: 00:00:00.00
sys. ora12c>alterpluggable database qdatapdb open;
Pluggable database altered.
Elapsed: 00:00:05.02
sys. ora12c>selectpdb_id, pdb_name, status, refresh_mode, refresh_interval from cdb_pdbs;
PDB_ID PDB_NAME STATUS REFRES REFRESH_INTERVAL
---------- ------------------------------ ---------- ----------------------
2 PDB$SEED NORMAL NONE
4 QDATAPDB NORMAL NONE
Elapsed: 00:00:00.00
sys. ora12c>
QDataPDB的状态已经由自动刷新转换成为了普通的PDB。
在 18c 中支持将经过 dblink 建立的可刷新 PDB 进行源 PDB 和克隆 PDB 进行 switchover ,源 PDB 将成为克隆 PDB ,原来的克隆 PDB 将成为源 PDB 。
<span style="color:#000000">SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 LEIPDB READ WRITE NO </span>
<span style="color:#000000">DROP USER c##lei CASCADE; CREATE USER c##lei IDENTIFIED BY oracle; GRANT CREATE SESSION, RESOURCE, CREATE ANY TABLE, UNLIMITED TABLESPACE TO c##lei CONTAINER=ALL; GRANT CREATE PLUGGABLE DATABASE TO c##lei CONTAINER=ALL; GRANT SYSOPER TO c##lei CONTAINER=ALL; </span>
<span style="color:#000000">ALTER SESSION SET CONTAINER = leipdb; CREATE TABLE cndba(id NUMBER); INSERT INTO cndba VALUES(1); COMMIT; SELECT * FROM cndba; N1 ---------- 1 </span>
<span style="color:#000000">DROP USER c##lei CASCADE; CREATE USER c##lei IDENTIFIED BY oracle; GRANT CREATE SESSION, RESOURCE, CREATE ANY TABLE, UNLIMITED TABLESPACE TO c##lei CONTAINER=ALL; GRANT CREATE PLUGGABLE DATABASE TO c##lei CONTAINER=ALL; GRANT SYSOPER TO c##lei CONTAINER=ALL; </span>
配置TNS
<span style="color:#000000">LEICDB = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.179)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = lei) ) ) </span>
建立dblink
<span style="color:#000000">CREATE DATABASE LINK leicdb_dblink CONNECT TO c##lei IDENTIFIED BY oracle USING 'leicdb';1 </span>
验证DBLINK是否正常
<span style="color:#000000">SQL> select COUNT(*) from v$version@leicdb_dblink; COUNT(*) ---------- 1 </span>
<span style="color:#000000">CREATE PLUGGABLE DATABASE leicdb_pdb FROM leipdb@leicdb_dblink CREATE_FILE_DEST='/u01/app/oracle/oradata/' REFRESH MODE MANUAL; </span>
<span style="color:#000000">SQL> INSERT INTO cndba VALUES(2); SQL> select * from cndba; ID ---------- 1 2 SQL> commit; </span>
刷新PDB
<span style="color:#000000">ALTER SESSION SET CONTAINER = leicdb_pdb; ALTER PLUGGABLE DATABASE REFRESH; </span>
查看新数据是否同步过来
<span style="color:#000000">ALTER PLUGGABLE DATABASE leicdb_pdb OPEN READ ONLY; ALTER SESSION SET CONTAINER = leicdb_pdb; select * from cndba; ID ---------- 1 </span>
<span style="color:#000000">LEICDB2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.178)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = lei) ) ) </span>
建立dblink
<span style="color:#000000">CREATE DATABASE LINK leicdb2_dblink CONNECT TO c##lei IDENTIFIED BY oracle USING 'leicdb2'; </span>
验证
<span style="color:#000000">select COUNT(*) from v$version@leicdb2_dblink; COUNT(*) ---------- 1 </span>
<span style="color:#000000">ALTER SESSION SET CONTAINER = leipdb; ALTER PLUGGABLE DATABASE REFRESH MODE MANUAL FROM leicdb_pdb@leicdb2_dblink SWITCHOVER; </span>
至此就完成了可刷新PDB的在线switchover。