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

客服微信

【Oracle OCP】Oracle 19c多租户之PDB重定位

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

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


从 Oracle 12.2 开始,您可以通过在两个根容器之间移动 PDB 来重新定位 PDB,并且停机时间几乎为零。


一、先决条件

在这种情况下,“本地”一词是指将容纳重新定位的 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, 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

切换到本地服务器并创建一个指向远程 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


四、重定位PDB

通过重新定位远程PDB,在本地CDB中创建新的PDB。在本例中,我们使用 Oracle Managed Files (OMF),因此我们不需要为文件名转换使用 FILE_NAME_CONVERT 参数。
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 <