Oracle数据库12c中引入的多租户选项允许单个容器数据库(CDB)托管多个独立的可插拔数据库(PDB)。本文介绍了将非CDB/PDB数据库迁移到PDB的选项。
- 克隆一个远程的Non-CDB
- 使用DBMS_PDB
- 使用数据泵(expdp,impdp)
- 使用复制技术
- 版本注意事项
克隆一个远程的Non-CDB
12.1.0.2补丁集引入了创建PDB作为远程非CDB克隆的能力。这将在另一篇文章中讨论 here.
使用DBMS_PDB
DBMS_PDB包允许您从non-CDB 12c数据库生成XML元数据文件,从而有效地使其能够像拔下PDB数据库时那样进行描述。这允许将non-CDB作为PDB插入现有CDB。
通常,在迁移之前,PDB中使用的任何功能都必须存在于目标CDB的根容器中。以下示例假设情况就是这样。
干净地关闭non-CDB并以只读模式启动它。
export ORACLE_SID=db12c
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
STARTUP OPEN READ ONLY;
使用DBMS_PDB.DESCRIBE过程描述non-DBC。此过程创建XML文件的方式与对PDB执行拔出操作的方式相同。
BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => '/tmp/db12c.xml');
END;
/
关闭non-CDB数据库。
export ORACLE_SID=db12c
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
连接到一个现有的CDB,并使用描述non-CDB数据库的文件创建一个新的PDB。请记住配置FILE_NAME_CONVERT参数以将现有文件转换到新位置。
export ORACLE_SID=cdb1
sqlplus / as sysdba
CREATE PLUGGABLE DATABASE pdb6 USING '/tmp/db12c.xml'
COPY
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/db12c/', '/u01/app/oracle/oradata/cdb1/pdb6/');
切换到PDB容器并运行“$ORACLE_HOME/rdbms/admin/nocdb_to_PDB.sql”脚本来清理新的PDB,删除PDB中不应存在的任何项目。您可以在此处看到此脚本生成的输出示例。
ALTER SESSION SET CONTAINER=pdb6;
@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
启动PDB并检查打开模式。
ALTER SESSION SET CONTAINER=pdb6;
ALTER PLUGGABLE DATABASE OPEN;
SELECT name, open_mode FROM v$pdbs;
NAME OPEN_MODE
------------------------------ ----------
PDB6 READ WRITE
1 row selected.
SQL>
non-CDB现已转换为PDB。您应该先备份PDB,然后再开始使用它。
使用数据泵(expdp,impdp)
一个简单的方法是从non-CDB导出数据,并将其直接导入到新创建的PDB中。如果导入使用指向相关PDB的服务进行连接,则这与使用数据泵的任何其他数据传输没有什么不同。
如果non-CDB是11.2.0.3版本以上,您可以考虑使用传输数据库here。如果non-CDB是11.2.0.3之前的版本,那么您仍然可以考虑使用可传输的表空间。
使用复制技术
另一种选择是使用类似Golden Gate的复制产品将数据从非容器数据库复制到可插拔数据库。
补丁注意事项
如果实例不在同一补丁级别,则PDB_PLUG_in_violations视图中将显示PDB冲突。如果目标的补丁级别高于源,只需以正常方式在目标实例上运行datapatch实用程序即可。它将决定需要做什么工作。
cd $ORACLE_HOME/OPatch
./datapatch -verbose
如果目标的补丁级别低于源的补丁级别,则需要运行datapatch -rollback操作,见此 here。
翻译员:无外乎逻辑与物理的两种迁移策略,克隆和DBMS_PDB是属于物理性质的迁移,理论上是要比其他的逻辑形式要快。