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

客服微信

【Oracle OCP】Oracle 19c热克隆远端PDB或非CDB

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

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


在 Oracle Database 12c 第 1 版 (12.1.0.1) 的初始版本中,PDB 远程克隆被列为一项功能,但它不起作用。12.1.0.2 补丁修复了这个问题,但还添加了创建 PDB 作为远程非 CDB 数据库克隆的功能。远程克隆的最大问题是在启动克隆过程之前将源 PDB 或非 CDB 置于只读模式的先决条件。这使得该功能对于克隆生产系统毫无用处,因为这种程度的停机时间通常是不可接受的。 Oracle Database 12c 第 2 版 (12.2) 消除了这一先决条件,首次支持 PDB 和非 CDB 的热克隆。


一、先决条件

克隆远程 PDB 或非 CDB 的先决条件非常相似,因此我将把它们放在一起处理。

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




在下面的示例中,我在同一虚拟机上运行三个数据库,但它们可以在单独的物理或虚拟服务器上运行。



二、克隆远端PDB

连接到远程 CDB 并准备远程 PDB 以进行克隆。

export ORAENV_ASK=NO
export ORACLE_SID=cdb3
. oraenv
export ORAENV_ASK=YES

sqlplus / as sysdba


在远程数据库中创建一个用户以与数据库链接一起使用。在本例中,我们将使用远程 CDB 中的普通用户。

CREATE USER c##remote_clone_user IDENTIFIED BY remote_clone_user CONTAINER=ALL;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;


检查远程CDB是否处于本地undo模式和archivelog模式。

CONN / AS SYSDBA

COLUMN property_name FORMAT A30
COLUMN property_value FORMAT A30

SELECT property_name, property_value
FROM database_properties
WHERE property_name = 'LOCAL_UNDO_ENABLED';

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED             TRUE

SQL>


SELECT log_mode
FROM v$database;

LOG_MODE
------------
ARCHIVELOG


因为远程CDB处于本地undo模式和archivelog模式,所以我们不需要将远程数据库变成只读模式。

切换到本地服务器并创建一个指向远程数据库的“tnsnames.ora”条目,以在数据库链接的 USING 子句中使用。
CDB3=
  (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.74.130)(PORT = 1521))
   (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = ORCLCDB)
   )
  )


连接到本地数据库以启动克隆。

export ORAENV_ASK=NO
export ORACLE_SID=cdb1
. oraenv
export ORAENV_ASK=YES

sqlplus / as sysdba


在本地数据库中创建数据库链接,指向远程数据库。

DROP DATABASE LINK clone_link;

CREATE DATABASE LINK clone_link
CONNECT TO c##remote_clone_user IDENTIFIED BY remote_clone_user USING 'cdb3';

-- Test link.
DESC user_tables@clone_link


通过克隆远程 PDB 在本地数据库中创建新的 PDB。在本例中,我们使用 Oracle Managed Files (OMF),因此我们不需要为文件名转换使用 FILE_NAME_CONVERT 参数。

CREATE PLUGGABLE DATABASE pdb5new FROM pdb5@clone_link;

Pluggable database created.


我们可以看到新的PDB已经创建,但是处于MOUNTED状态。

COLUMN name FORMAT A30

SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5NEW';

NAME                           OPEN_MODE
------------------------------ ----------
PDB5NEW                        MOUNTED


PDB以读写模式打开来完成该过程。

ALTER PLUGGABLE DATABASE pdb5new OPEN;

SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5NEW';

NAME                           OPEN_MODE
------------------------------ ----------
PDB5NEW                        READ WRITE


与任何 PDB 克隆一样,检查公共用户,临时表空间是否按预期配置。

三、克隆远端非CDB

连接到远程数据库以准备克隆。

export ORAENV_ASK=NO
export ORACLE_SID=db12c
. oraenv
export ORAENV_ASK=YES

sqlplus / as sysdba


在远程数据库中创建一个用户以与数据库链接一起使用。

CREATE USER remote_clone_user IDENTIFIED BY remote_clone_user;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_clone_user;


检查远程非CDB是否为archivelog模式。

SELECT log_mode
FROM v$database;

LOG_MODE
------------
ARCHIVELOG


在 Oracle 12.1 中,我们会在继续之前将远程数据库切换为只读模式,但在 Oracle 12.2 中,如果源数据库处于归档日志模式,则不需要这样做。

切换到本地服务器并创建一个指向远程数据库的“tnsnames.ora”条目,以在数据库链接的 USING 子句中使用。

DB19C =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.74.130)(PORT = 1521))
    )
    (CONNECT_DATA =
     (SERVICE_NAME = noncdb)
    )
  )


连接到本地数据库以启动克隆。

export ORAENV_ASK=NO
export ORACLE_SID=cdb1
. oraenv
export ORAENV_ASK=YES

sqlplus / as sysdba


在本地数据库中创建数据库链接,指向远程数据库。

DROP DATABASE LINK clone_nocdb_link;

CREATE DATABASE LINK clone_nocdb_link
CONNECT TO remote_clone_user IDENTIFIED BY remote_clone_user USING 'db19c';

-- Test link.
DESC user_tables@clone_nocdb_link;


通过克隆远程非 CDB 在本地数据库中创建新的 PDB。在本例中,我们使用 Oracle Managed Files (OMF),因此我们不需要为文件名转换使用 FILE_NAME_CONVERT 参数。由于没有 PDB 可供命名,因此我们使用“NON$CDB”作为 PDB 名称。

CREATE PLUGGABLE DATABASE db19cpdb FROM NON$CDB@clone_nocdb_link;

Pluggable database created.


我们可以看到新的PDB已经创建,但是处于MOUNTED状态。

COLUMN name FORMAT A30

SELECT name, open_mode FROM v$pdbs WHERE name = 'DB19CPDB';

NAME                           OPEN_MODE
------------------------------ ----------
DB12CPDB                       MOUNTED


由于此 PDB 是作为非 CDB 的克隆创建的,因此在打开它之前,我们需要运行

“$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql”脚本来清理它。

--如果不运行直接打开PDB,查看PDB_PLUG_IN_VIOLATIONS提示
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.

--执行脚本
ALTER SESSION SET CONTAINER=DB19CPDB;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql


现在可以以读写模式打开 PDB。

 ALTER PLUGGABLE DATABASE DB19CPDB OPEN;

SELECT name, open_mode FROM v$pdbs WHERE name = 'DB19CPDB';

NAME                           OPEN_MODE
------------------------------ ----------
DB12CPDB                       READ WRITE


与任何 PDB 克隆一样,检查公共用户,临时表空间是否按预期配置。

四、补充

以下 DBCA 命令用于创建和删除这些示例中使用的 CDB 实例和 PDB。

# Local container (cdb1).
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname cdb1 -sid cdb1 -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName pdb1 \
-pdbAdminPassword SysPassword1 \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 2048 \
-storageType FS \
-datafileDestination "/u02/oradata/" \
-redoLogFileSize 50 \
-initParams encrypt_new_tablespaces=DDL \
-emConfiguration NONE \
-ignorePreReqs

# Remote container (cdb3) with PDB (pdb5).
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname cdb3 -sid cdb3 -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName pdb5 \
-pdbAdminPassword SysPassword1 \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 2048 \
-storageType FS \
-datafileDestination "/u02/oradata/" \
-redoLogFileSize 50 \
-initParams encrypt_new_tablespaces=DDL \
-emConfiguration NONE \
-ignorePreReqs

# Non-CDB instance (db19c).
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname db19c -sid db19c -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase false \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 2048 \
-storageType FS \
-datafileDestination "/u02/oradata/" \
-redoLogFileSize 50 \
-initParams encrypt_new_tablespaces=DDL \
-emConfiguration NONE \
-ignorePreReqs



# Delete the instances.
dbca -silent -deleteDatabase -sourceDB cdb1 -sysDBAUserName sys - sysDBAPassword SysPassword1
dbca -silent -deleteDatabase -sourceDB cdb3 -sysDBAUserName sys - sysDBAPassword SysPassword1
dbca -silent -deleteDatabase -sourceDB db19c -sysDBAUserName sys - sysDBAPassword SysPassword1


如前所述,在所有情况下都使用 Oracle Managed Files (OMF),因此不需要文件名转换。此外,源数据库已切换到归档日志模式。

export ORAENV_ASK=NO
export ORACLE_SID=cdb3
. oraenv
export ORAENV_ASK=YES

sqlplus / as sysdba <