陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235/19906632509(微信同号)

客服微信

【Oracle OCP】Oracle 19c多租户之PDB Refresh

作者:炎燚小寶
发布时间:2023-12-19 09:19
浏览量:293

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


从 Oracle Database 12.2 开始,可以刷新远程热克隆 PDB 的内容,前提是它是作为可刷新 PDB创建的,并且仅以只读模式打开过。只读 PDB 可用于报告目的,或作为其他克隆的源,以在定期需要多个最新克隆时最大限度地减少对生产系统的影响。


一、先决条件

在这种情况下,“本地”一词是指将容纳克隆的 PDB 的目的地或目标 CDB。 “远程”一词是指作为克隆源的 PDB。

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端

我们想要证明新的 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

现在源 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。