客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
从 Oracle 12.2 开始,您可以通过在两个根容器之间移动 PDB 来重新定位 PDB,并且停机时间几乎为零。
在这种情况下,“本地”一词是指将容纳重新定位的 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, SYSOPER, CREATE PLUGGABLE DATABASE TO c##remote_clone_user CONTAINER=ALL;
检查远程CDB是否处于本地undo模式和archivelog模式。
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模式,所以我们不需要将远程数据库变成只读模式。
切换到本地服务器并创建一个指向远程 CDB 的“tnsnames.ora”条目,以在数据库链接的 USING 子句中使用。连接详细信息必须包含“(SERVER = DEDICATED)”条目,否则您将收到“ORA-01031:权限不足”错误。
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
检查本地CDB是否处于本地undo模式和archivelog模式。
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中创建公共数据库链接,指向远程CDB。
请记住在搬迁完成后将其删除。
DROP PUBLIC DATABASE LINK clone_link; CREATE PUBLIC DATABASE LINK clone_link CONNECT TO c##remote_clone_user IDENTIFIED BY remote_clone_user USING 'cdb3'; -- Test link. DESC user_tables@clone_link
CREATE PLUGGABLE DATABASE pdb5 FROM pdb5@clone_link RELOCATE;
如果没有使用OMF,示例如下
CREATE PLUGGABLE DATABASE pdb12 FROM pdb12@clone_link RELOCATE FILE_NAME_CONVERT=('/opt/oracle/oradata/ORCLCDB/pdb12/','/u01/app/oracle/oradata/ORCLCDB/ pdb12/'); /opt/oracle/oradata/ORCLCDB/pdb12/是远端的pdb目录 /u01/app/oracle/oradata/ORCLCDB/pdb12/是本地的pdb目录
我们可以看到新的PDB已经创建,但是处于MOUNTED状态。
COLUMN name FORMAT A30 SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5'; NAME OPEN_MODE ------------------------------ ---------- PDB5 MOUNTED
PDB以读写模式打开来完成该过程。
ALTER PLUGGABLE DATABASE pdb5 OPEN; SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5'; NAME OPEN_MODE ------------------------------ ---------- PDB5 READ WRITE
删除公共数据库链接。
DROP PUBLIC DATABASE LINK clone_link;
与任何 PDB 克隆一样,检查公共用户,临时表空间是否按预期配置。
如果我们切换回远程实例,我们可以看到 PDB5 已被删除。
export ORAENV_ASK=NO export ORACLE_SID=cdb3 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba SELECT name, open_mode FROM v$pdbs WHERE name = 'PDB5'; no rows selected
移动数据库只是保持系统运行的一方面。一旦数据库位于新位置,您需要确保仍然可以与其建立连接。选项如下。
以下是用于创建和删除这些示例使用的 CDB 实例和 PDB 的 DBCA 命令。
# Empty 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 export ORAENV_ASK=NO export ORACLE_SID=cdb1 . oraenv export ORAENV_ASK=YES sqlplus / as sysdba <