能否通过RMAN备份将PDB恢复到其他CDB?不使用PDB克隆方式
该操作完全可行,核心是通过RMAN原生的异机PDB恢复能力实现,无需使用CLONE PDB语法,具体操作流程如下:
前提条件
- 源端和目标端的Oracle数据库版本(包括补丁集版本)必须完全一致,避免版本兼容性导致恢复失败
- 目标CDB已经处于正常运行的
OPEN状态,且字符集、国家字符集和源端一致 - 源端生成的PDB全量RMAN备份集、归档日志备份集(如需不完全恢复)已全部传输到目标端服务器的可访问路径下
- 你持有目标CDB的
SYSDBA或SYSOPER权限
操作步骤
步骤1:(可选)目标端设置源CDB的DBID
如果目标端存储了多个备份集,提前设置源CDB的DBID可快速定位对应备份:
RMAN> SET DBID = <源端CDB的DBID>;
注意此处填写的是源PDB所属的源CDB的DBID,不是PDB自身的DBID
步骤2:连接目标端RMAN
在目标端服务器执行命令连接到目标CDB:
$ rman target /
步骤3:注册源PDB备份集
假设备份集存放在目标端/backup/rman/pdb_src/路径下,执行命令将备份集注册到RMAN仓库:
RMAN> CATALOG START WITH '/backup/rman/pdb_src/';
出现确认提示时输入YES完成注册。
步骤4:执行PDB恢复
恢复后PDB名称和源端一致
直接执行以下RMAN语句:
RMAN> RUN { SET NEWNAME FOR PLUGGABLE DATABASE <源PDB名称> TO NEW; RESTORE PLUGGABLE DATABASE <源PDB名称>; SWITCH PLUGGABLE DATABASE <源PDB名称> ALL; RECOVER PLUGGABLE DATABASE <源PDB名称>; }
恢复后修改PDB名称
先在目标CDB的SQL命令行创建一个空的目标PDB:
SQL> CREATE PLUGGABLE DATABASE <新PDB名称> ADMIN USER tempadmin IDENTIFIED BY temp123 ROLES=(DBA);
创建完成后立即关闭该空PDB:
SQL> ALTER PLUGGABLE DATABASE <新PDB名称> CLOSE IMMEDIATE;
回到RMAN执行恢复,指定用源PDB备份集覆盖该空PDB:
RMAN> RUN { SET NEWNAME FOR PLUGGABLE DATABASE <新PDB名称> TO NEW; RESTORE PLUGGABLE DATABASE <新PDB名称> FROM PLUGGABLE DATABASE <源PDB名称>; SWITCH PLUGGABLE DATABASE <新PDB名称> ALL; RECOVER PLUGGABLE DATABASE <新PDB名称>; }
步骤5:打开恢复后的PDB
首次打开PDB需要执行重置日志操作:
SQL> ALTER PLUGGABLE DATABASE <PDB名称> OPEN RESETLOGS;
如果出现元数据兼容性报错,先将PDB启动到升级模式:
SQL> ALTER PLUGGABLE DATABASE <PDB名称> OPEN UPGRADE;
执行同步脚本修复元数据:
SQL> @?/rdbms/admin/noncdb_to_pdb.sql
脚本执行完成后重新正常打开PDB即可。
注意事项
- 如果源PDB启用了透明数据加密(TDE),需要提前将源端的TDE钱包复制到目标端,配置钱包自动打开后再执行恢复操作
- 如果出现数据文件路径找不到的报错,可以提前通过
DB_FILE_NAME_CONVERT参数配置源端到目标端的路径映射,或者在RMAN的RUN块中单独指定每个数据文件的新路径 - 如果需要做不完全恢复到指定时间点/SCN,可以在RECOVER命令前追加
SET UNTIL SCN <目标SCN>或者SET UNTIL TIME "TO_DATE('YYYY-MM-DD HH24:MI:SS','你使用的时间格式')"参数
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

