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

客服微信

【Oracle OCP】Oracle 19c多租户之PDB归档插拨

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

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

在 Oracle 12.1 中,可插入数据库可以拔出到“.xml”文件,该文件描述了可插入数据库的内容。要移动PDB,您需要手动移动“.xml”文件和所有相关的数据库文件。除了此功能之外,Oracle 12.2 还允许将PDB 拔出到“.pdb”存档文件。生成的存档文件包含描述 PDB 的“.xml”文件以及与 PDB 关联的所有数据文件。这可以简化服务器之间的文件传输并减少人为错误的可能性。

本文包括 Oracle 12.1 中提供的拔出/插入功能。这是在 12.1 文章中首次描述的。

本文假设您使用的是 Oracle Managed Files (OMF)。如果不是,您将需要添加文件名转换信息,如此处所述。


一、卸载(拨出)PDB到.pdb文件

在尝试拔下 PDB 之前,必须确保其已关闭。要拔出数据库,请使用带有 UNPLUG INTO 子句的ALTER PLUGGABLE DATABASE 命令来指定“.pdb”归档文件的位置。

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

sqlplus / as sysdba


ALTER PLUGGABLE DATABASE pdb5 CLOSE;
ALTER PLUGGABLE DATABASE pdb5 UNPLUG INTO '/home/oracle/pdb20.pdb';


您会看到存档文件现在存在。

[oracle@ora19c ORCLCDB]$ ls -lt /home/oracle/pdb20.pdb
-rw-r--r-- 1 oracle oinstall 109286243 Aug 27 02:31 /home/oracle/pdb20.pdb


您可以删除 PDB 并删除数据文件,因为它们都存在于存档文件中。

DROP PLUGGABLE DATABASE pdb5 INCLUDING DATAFILES;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY


二、装载(插入).pdb归档文件到PDB

将 PDB 插入新的CDB 类似于创建新的 PDB。首先通过调用 DBMS_PDB.CHECK_PLUG_COMPATIBILITY 函数检查 PBD 是否与 CDB 兼容,并传入存档文件和要使用它创建的 PDB 的名称。

SET SERVEROUTPUT ON
DECLARE
  l_result BOOLEAN;
BEGIN
  l_result := DBMS_PDB.check_plug_compatibility(
                pdb_descr_file => '/home/oracle/pdb20.pdb',
                pdb_name => 'pdb20');

  IF l_result THEN
    DBMS_OUTPUT.PUT_LINE('compatible');
  ELSE
    DBMS_OUTPUT.PUT_LINE('incompatible');
  END IF;
END;
/
compatible

PL/SQL procedure successfully completed.


如果 PDB 不兼容,则会在 PDB_PLUG_IN_VIOLATIONS 视图中列出违规行为。如果 PDB 兼容,请使用它作为源创建一个新的 PDB。如果我们用新名称创建它,我们可能会这样做。

CREATE PLUGGABLE DATABASE pdb20 USING '/home/oracle/pdb20.pdb';

ALTER PLUGGABLE DATABASE pdb20 OPEN READ WRITE;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY
PDB20                  READ WRITE


我们希望将数据库插回到同一个容器中,我们可以执行以下操作,复制是必须的操作。

CREATE PLUGGABLE DATABASE pdb20 USING '/home/oracle/pdb20.pdb'
TEMPFILE REUSE;

ALTER PLUGGABLE DATABASE pdb20 OPEN READ WRITE;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;


三、卸载(拨出)PDB到.xml文件

在尝试拔下 PDB 之前,必须确保其已关闭。要拔出数据库,请使用 ALTER PLUGGABLE DATABASE 命令和 UNPLUG INTO 子句来指定 XML 元数据文件的位置。

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

sqlplus / as sysdba


ALTER PLUGGABLE DATABASE pdb5 CLOSE;
ALTER PLUGGABLE DATABASE pdb5 UNPLUG INTO '/u01/pdb5.xml';


可插入数据库仍然存在,但在元数据文件和所有数据文件复制到安全的地方之前,您不应该打开它。

COLUMN name FORMAT A30

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY
PDB20                  MOUNTED


您可以删除 PDB,选择将文件保留在文件系统上。

DROP PLUGGABLE DATABASE pdb5 KEEP DATAFILES;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY


四、装载(插入).xml文件到PDB

首先通过调用 DBMS_PDB.CHECK_PLUG_COMPATIBILITY 函数检查 PBD 是否与 CDB 兼容,并传入 XML 元数据文件和要使用它创建的 PDB 的名称。

SET SERVEROUTPUT ON
DECLARE
  l_result BOOLEAN;
BEGIN
  l_result := DBMS_PDB.check_plug_compatibility(
                pdb_descr_file => '/u01/pdb5.xml',
                pdb_name => 'pdb5');

  IF l_result THEN
    DBMS_OUTPUT.PUT_LINE('compatible');
  ELSE
    DBMS_OUTPUT.PUT_LINE('incompatible');
  END IF;
END;
/
compatible

PL/SQL procedure successfully completed.


如果 PDB 不兼容,则会在 PDB_PLUG_IN_VIOLATIONS 视图中列出违规行为。如果 PDB 兼容,请使用它作为源创建一个新的 PDB。如果我们用新名称创建它,我们可能会这样做。

CREATE PLUGGABLE DATABASE pdb2 USING '/u01/pdb5.xml'
2 FILE_NAME_CONVERT=('/u02/app/oracle/oradata/cdb3/pdb5/','/u02/app/oracle/oradata/cdb3/pdb2/');


相反,我们希望将数据库插回到同一个容器中,因此我们不需要复制文件或重新创建临时文件,因此我们可以执行以下操作。

CREATE PLUGGABLE DATABASE pdb5 USING '/u01/pdb5.xml'
NOCOPY
TEMPFILE REUSE;

ALTER PLUGGABLE DATABASE pdb5 OPEN READ WRITE;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY
PDB5                   READ WRITE


五、注意事件