客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
在 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。
连接到远程 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模式,所以我们不需要将远程数据库变成只读模式。
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 克隆一样,检查公共用户,临时表空间是否按预期配置。
连接到远程数据库以准备克隆。
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 <