客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
从 Oracle Database 12.2 开始,可以刷新远程热克隆 PDB 的内容,前提是它是作为可刷新 PDB创建的,并且仅以只读模式打开过。只读 PDB 可用于报告目的,或作为其他克隆的源,以在定期需要多个最新克隆时最大限度地减少对生产系统的影响。
在这种情况下,“本地”一词是指将容纳克隆的 PDB 的目的地或目标 CDB。 “远程”一词是指作为克隆源的 PDB。
PDB 刷新的先决条件与热远程克隆的先决条件类似,参考PDB克隆过程。
除了热远程克隆的前提条件外,我们还必须考虑以下因素。
在下面的示例中,我们有两个数据库在同一虚拟机上运行,但它们可以在单独的物理或虚拟服务器上运行。
连接到本地数据库以启动克隆。
export ORAENV_ASK=NO export ORACLE_SID=cdb1 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba
通过克隆远程 PDB 在本地数据库中创建新的 PDB。在本例中,我们使用 Oracle Managed Files (OMF),因此我们不需要为文件名转换使用 FILE_NAME_CONVERT 参数。在本例中,我们使用手动刷新模式。
CREATE PLUGGABLE DATABASE pdb5_ro FROM pdb5@clone_link REFRESH MODE MANUAL; Pluggable database created.
我们可以看到新的PDB已经创建,但是处于MOUNTED状态。
COLUMN name FORMAT A30 SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5_RO'; NAME OPEN_MODE ------------------------------ ---------- PDB5_RO MOUNTED
以只读模式打开以完成该过程。
ALTER PLUGGABLE DATABASE pdb5_ro OPEN READ ONLY; SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5_RO'; NAME OPEN_MODE ------------------------------ ---------- PDB5_RO READ ONLY SQL> -- 19c SELECT last_refresh_scn FROM dba_pdbs WHERE pdb_name = 'PDB5_RO'; LAST_REFRESH_SCN ---------------- 1555382
我们想要证明新的 PDB 可以刷新,因此我们将在源数据库中添加一个新的表空间、用户和该用户拥有的表。
连接到源数据库。
export ORAENV_ASK=NO export ORACLE_SID=cdb3 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba
对源 PDB 进行一些更改。
ALTER SESSION SET CONTAINER=pdb5; drop TABLESPACE test_ts including contents and datafiles; CREATE TABLESPACE test_ts DATAFILE SIZE 1M AUTOEXTEND ON NEXT 1M; drop user test cascade; CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE test_ts QUOTA UNLIMITED ON test_ts; GRANT CREATE SESSION, CREATE TABLE TO test; CREATE TABLE test.t1 ( id NUMBER ); INSERT INTO test.t1 VALUES (1); COMMIT;
现在源 PDB 与克隆不同,因此我们应该能够轻松查看克隆是否可以刷新。
连接到目标数据库。
export ORAENV_ASK=NO export ORACLE_SID=cdb1 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba
切换到可刷新的 PDB 并检查测试表是否存在。它还不会存在。
ALTER SESSION SET CONTAINER=pdb5_ro; SELECT * FROM test.t1; SELECT * FROM test.t1 * ERROR at line 1: ORA-00942: table or view does not exist
下面的示例显示了两种可能的方法
-- Post 19c : From root container. CONN / AS SYSDBA ALTER PLUGGABLE DATABASE pdb5_ro CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE pdb5_ro REFRESH; ALTER PLUGGABLE DATABASE pdb5_ro OPEN READ ONLY; -- Post 19c: From refreshable PDB. ALTER SESSION SET CONTAINER=pdb5_ro; ALTER PLUGGABLE DATABASE CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE REFRESH; ALTER PLUGGABLE DATABASE OPEN READ ONLY; -- 查看刷新SCN SELECT last_refresh_scn FROM dba_pdbs WHERE pdb_name = 'PDB5_RO'; LAST_REFRESH_SCN ---------------- 1557699 SQL>
再次检查测试表是否存在。现在它将存在。
ALTER SESSION SET CONTAINER=pdb5_ro; SELECT * FROM test.t1; ID ---------- 1
请注意,表空间也是在可刷新 PDB 中创建的。
SELECT tablespace_name FROM dba_tablespaces ORDER BY 1; TABLESPACE_NAME ------------------------------ SYSAUX SYSTEM TEMP TEST_TS UNDOTBS1 USERS
在上面的示例中,我们使用手动刷新模式创建了一个可刷新的 PDB。或者我们可以让它自动刷新。创建过程中可能出现的变化如下所示。
--手工刷新模式. CREATE PLUGGABLE DATABASE pdb5_ro FROM pdb5@clone_link REFRESH MODE MANUAL; -- 每60分钟刷新一次. CREATE PLUGGABLE DATABASE pdb5_ro FROM pdb5@clone_link REFRESH MODE EVERY 60 MINUTES; -- 无刷新模式的PDB. -- 以下两种方式作用一样 CREATE PLUGGABLE DATABASE pdb5_ro FROM pdb5@clone_link REFRESH MODE NONE; CREATE PLUGGABLE DATABASE pdb5_ro FROM pdb5@clone_link;
可以使用DBA_PDBS视图查询当前的刷新模式。
COLUMN pdb_name FORMAT A30 SELECT pdb_id, pdb_name, refresh_mode, refresh_interval FROM dba_pdbs ORDER BY 1; PDB_ID PDB_NAME REFRES REFRESH_INTERVAL ---------- ------------------------------ ------ ---------------- 3 PDB5_RO MANUAL
创建可刷新 PDB 后可以更改刷新模式,如下所示。
-- Alter the refresh interval. ALTER PLUGGABLE DATABASE pdb5_ro REFRESH MODE EVERY 60 MINUTES; ALTER PLUGGABLE DATABASE pdb5_ro REFRESH MODE EVERY 120 MINUTES; -- Set an automatically refreshed PDB to manual mode. ALTER PLUGGABLE DATABASE pdb5_ro REFRESH MODE MANUAL; -- Make a refreshable PDB non-refreshable. ALTER PLUGGABLE DATABASE pdb5_ro CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE pdb5_ro REFRESH MODE NONE; ALTER PLUGGABLE DATABASE pdb5_ro OPEN;
请记住,一旦 PDB 变为不可刷新,就无法再次变为可刷新。
ALTER PLUGGABLE DATABASE pdb5_ro CLOSE IMMEDIATE; ALTER PLUGGABLE DATABASE pdb5_ro REFRESH MODE MANUAL; ALTER PLUGGABLE DATABASE pdb5_ro OPEN; --报错如下 ORA-65261: pluggable database pdb5_ro not enabled for refresh
仅当 PDB 关闭时才能进行自动刷新。这听起来很奇怪,但是当可刷新的 PDB 是克隆链的源时,就应该使用自动刷新。因此,您可以以只读方式打开它,将其用作新克隆的源,然后再次关闭它,以便它保持最新状态。如果您希望 PDB 在大多数情况下以只读方式打开,最好定义自己的作业来关闭、刷新并再次打开 PDB。