RMAN不能直接克隆non-CDB到PDB,必须通过DBMS_PDB.DESCRIBE生成XML描述文件,再用CREATE PLUGGABLE DATABASE USING完成插拔;RMAN仅能辅助复制文件,DUPLICATE命令不支持non-CDB作为源。

RMAN 不能直接克隆 non-CDB 到 PDB —— 这是硬限制,不是操作问题。你试图用 RMAN RESTORE 或 DUPLICATE 把一个 standalone non-CDB “塞进” CDB,Oracle 会拒绝,因为物理文件里没有容器元数据(CON_ID、CDB$ROOT 视图、V$PDBS 条目等)。必须走 DBMS_PDB.DESCRIBE + CREATE PLUGGABLE DATABASE USING 流程,RMAN 只能辅助搬运文件。
为什么 RMAN DUPLICATE 对 non-CDB 失效
Oracle 12c 的 DUPLICATE 命令只支持三种目标:CDB、已存在的 PDB、或远程 active PDB(18c+)。它不识别 standalone non-CDB 为合法源。尝试执行类似 DUPLICATE DATABASE TO cdb 会报 ORA-65120: pluggable database name is not valid 或直接卡在 catalog 校验阶段——RMAN 发现源库的 V$DATABASE.CDB 是 NO,立刻终止。
常见错误现象:
- 运行
DUPLICATE后 RMAN 日志中出现source database is not a container database - 目标端 CDB 启动后查
V$PDBS空,SELECT CON_ID, NAME FROM V$CONTAINERS不显示新库 - 手动把 non-CDB 数据文件拷过去再
CREATE PLUGGABLE DATABASE ... DATAFILE,报ORA-65139: invalid XML metadata file(因缺 XML 描述)
真正可行的“快速”路径:RMAN COPY + DBMS_PDB.DESCRIBE
所谓“快速”,是指最小化源库只读窗口,而非跳过关键步骤。核心是用 RMAN 把数据文件物理复制到目标位置,再用极短时间将源库切为 READ ONLY 执行描述生成。
实操建议:
- 源 non-CDB 保持
OPEN,先执行:RMAN> BACKUP AS COPY DATABASE FORMAT '/backup/%U' TAG 'pdb_prep'; - 复制完成后,立即:
ALTER DATABASE OPEN READ ONLY;(停机窗口仅几秒) - 执行:
BEGIN DBMS_PDB.DESCRIBE(pdb_descr_file => '/backup/noncdb.xml'); END; - 恢复源库:
SHUTDOWN IMMEDIATE; STARTUP; - 把
/backup/noncdb.xml和 RMAN COPY 出的文件一起传到 CDB 主机
注意:DBMS_PDB.DESCRIBE 必须在 READ ONLY 下运行,否则报 ORA-65132;XML 中记录的是源端绝对路径,后续 CREATE PLUGGABLE DATABASE 必须用 FILE_NAME_CONVERT 映射,漏一项就 ORA-65111。
CREATE PLUGGABLE DATABASE 时的关键参数与陷阱
这一步才是让 non-CDB “变成” PDB 的实质动作,RMAN 已退出舞台。语法形如:
CREATE PLUGGABLE DATABASE pdb1 USING '/backup/noncdb.xml'
SOURCE_FILE_NAME_CONVERT = ('/oradata/old/', '/u01/oradata/CDB1/pdb1/')
PATH_PREFIX = '/u01/oradata/CDB1/pdb1/'
FILE_NAME_CONVERT = ('/oradata/old/', '/u01/oradata/CDB1/pdb1/');
容易踩的坑:
-
SOURCE_FILE_NAME_CONVERT和FILE_NAME_CONVERT必须同时指定,且值要严格匹配 XML 中的路径(包括末尾斜杠) -
PATH_PREFIX是 PDB 内部对象默认存储路径,不设会导致后续创建表空间失败 - 若源库启用了 TDE,XML 中会有
<tdewalletlocation></tdewalletlocation>,目标 CDB 必须提前配置相同 wallet 并ADMINISTER KEY MANAGEMENT SET KEY - 创建后 PDB 默认
MOUNTED,需ALTER PLUGGABLE DATABASE pdb1 OPEN;;首次 OPEN 会重写所有数据文件头,耗时取决于文件大小
迁移后密码、字符集、归档模式的强制继承
这是最容易被忽略的隐性约束:新 PDB 的 SYS/SYSTEM 密码不是原 non-CDB 的,而是继承 CDB root 的密码;字符集、timezone、归档模式全部对齐 CDB,无法单独设置。例如源库是 ZHS16GBK、CDB 是 AL32UTF8,则 PDB 字符集自动转为 AL32UTF8,且过程不可逆。
若强行绕过(如修改 XML 中的 characterSet 字段),CREATE 阶段会报 ORA-65138: invalid character set in XML file。别碰 NID 工具改 DBID —— CDB 下 nid 会破坏 PDB 文件头中的容器标识,导致 ORA-65086: cannot open pluggable database。


















