是,18c起oracle文档明确支持duplicate pluggable database语法,但仅限克隆到已启用local_undo_enabled=true的目标cdb,且必须使用from active database、配置正确db_link和大小写匹配的服务名,否则报ora-65557。

RMAN DUPLICATE PLUGGABLE DATABASE 在 18c 中确实能跨 CDB 克隆,但必须满足硬性前提,否则直接报错 ORA-65557
DUPLICATE PLUGGABLE DATABASE 语法是否可用?
18c 开始文档中明确支持 DUPLICATE PLUGGABLE DATABASE 语法,但仅限于克隆到**已存在的目标 CDB**(非新建 CDB),且该目标 CDB 必须已启用 LOCAL_UNDO_ENABLED=TRUE。不满足时,RMAN 会拒绝执行,报 ORA-65557 或静默降级为 CDB 级克隆。
- 源端 PDB 必须处于
READ ONLY模式(12.2)或可保持READ WRITE(18c+ 且LOCAL_UNDO=TRUE) - 目标 CDB 必须提前配置数据库链接指向源 CDB(如
@src_cdb),且该链接用户需有CREATE PLUGGABLE DATABASE权限 -
FROM ACTIVE DATABASE是必须项;不支持从备份集直接克隆单个 PDB(BACKUP LOCATION仅用于 CDB 级 DUPLICATE)
实际执行时路径映射怎么写?
不能只靠 DB_FILE_NAME_CONVERT —— 18c 的 DUPLICATE PLUGGABLE DATABASE 要求显式指定所有文件路径转换,且必须覆盖数据文件、临时文件、undo 表空间三类位置。漏掉任意一类,OPEN 时会卡在 ORA-01157 或 ORA-01110。
- 用
SET DB_FILE_NAME_CONVERT转换数据文件(如'/old/oradata/','/new/oradata/') - 必须加
SET TEMPFILE_NAME_CONVERT,否则新 PDB 的临时表空间无法创建 - 若源 PDB 使用本地 undo,目标端需确保
UNDO TABLESPACE名称不冲突,建议用SET UNDO_TABLESPACE 'UNDOTBS2'显式指定
为什么连上 auxiliary 实例后 RMAN 报 ORA-12154?
这不是网络问题,而是辅助实例未正确识别目标 CDB 的服务名。18c 的跨 CDB PDB 克隆要求辅助实例的 tnsnames.ora 中,目标 CDB 的连接描述符(alias)必须与你在 DUPLICATE 命令里写的 TO cdb_name 完全一致,包括大小写。
- 例如命令是
DUPLICATE PLUGGABLE DATABASE pdb1 TO ORCLCDB ...,则tnsnames.ora里必须定义ORCLCDB = (...),不能是orclcdb或OrclCdb - 辅助实例的
ORACLE_SID必须设为目标 CDB 的 SID(不是新 PDB 名),否则监听注册失败 - 检查
lsnrctl status输出中是否有对应 service name,没有则说明静态注册缺失或local_listener配置错误
克隆完成后 PDB 打不开怎么办?
常见原因是字节序不一致或版本不兼容。18c 的 DUPLICATE PLUGGABLE DATABASE 不做平台转换,源和目标必须同构(如都是 Linux x86-64),且补丁集级别差异不能超过一个季度。
- 执行
ALTER PLUGGABLE DATABASE pdb1 OPEN RESTRICTED后查V$PDB_HISTORY,看最后一条记录的OPERATION是否为DUPLICATE,STATUS是否为SUCCESS - 若出现
ORA-65139: The data file size does not match the block size,说明源库用了非标准块大小(如 16K),而目标 CDB 的DB_BLOCK_SIZE不匹配 - 打开失败时别急着删 PDB,先运行
SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS确认状态;MOUNTED状态下可尝试RECOVER PLUGGABLE DATABASE pdb1
真正麻烦的不是命令敲错,而是 LOCAL_UNDO 和字节序这两个条件——它们不报语法错误,但会让整个流程在 OPEN 阶段无声失败。











