Oracle 19c:RMAN Duplicate异机复制数据库实操_20260402

张开发
2026/4/18 0:13:16 15 分钟阅读

分享文章

Oracle 19c:RMAN Duplicate异机复制数据库实操_20260402
Duplicating Databases官方文档https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-duplicating-databases.html#GUID-F31F9FCE-B610-49EB-B9DB-44B9AA4E838FRecovery Manager (RMAN) 是一款 Oracle 数据库客户端可对数据库执行备份和恢复任务并自动管理备份策略。它极大地简化了数据库文件的备份、恢复和恢复过程。先一句话讲明白本文要说的这个功能RMAN Duplicate就是把源库复制到另一台服务器上自动生成一套新的 Oracle 数据库。它不是简单拷贝文件也不是普通手工恢复。你可以把它理解成Oracle 官方提供的自动化克隆数据库方法。一、RMAN Duplicate 有哪些方式RMAN Duplicate 常见可以分成两大类1Active Database Duplicate这种方式是直接从正在运行的源库通过网络复制到目标端不需要提前准备 RMAN 备份。它的特点是源库在线即可执行不需要先备份、再传备份文件操作流程更直接适合搭测试库、异机复制、恢复演练2Backup-based Duplicate这种方式是先基于已有的 RMAN 备份再在目标端恢复出一套新库。它的特点是需要提前有可用备份适合网络带宽有限的场景也适合源库当前不方便直接连接但备份仍可用的场景二、本文演示的是最常用的一种Active Database Duplicate也就是不需要提前备份源库直接通过网络把源库复制到目标端。对于日常运维来说这种方式更直接也更适合实战。三、实验环境为了适合公开发博客示例环境统一如下角色主机名IPOracle版本说明源库ora-prod192.168.10.1119c已存在业务数据库目标库ora-dup192.168.10.1219c只安装 Oracle 软件未建库数据库名统一示例为appdbTNS 别名统一为APPDB_PROD -- 源库连接名 APPDB_DUP -- 目标库连接名四、做 Duplicate 前要满足什么条件开始前先确认这些条件源端和目标端 Oracle 主版本一致目标端只安装 Oracle 软件不需要提前建库目标端磁盘空间不能小于源端两台服务器网络互通源库建议开启归档模式两端监听正常源库和目标库都能通过 TNS 连接说白了Duplicate 真正难的不是命令本身而是前置条件没准备好。五、整个流程其实就 5 步RMAN Duplicate 看起来步骤多核心流程其实就这些两端配置 hosts目标端配置静态监听两端配置 TNS源端导出并修改 pfile再传到目标端目标端启动到nomount执行 duplicate一句话概括先把目标端“接收数据库的壳子”搭起来再让 Oracle 自动把源库复制过去。六、正式操作步骤第1步配置 hosts执行位置两端cat EOF /etc/hosts 192.168.10.11 ora-prod 192.168.10.12 ora-dup EOF这一步的作用是让两台服务器能通过主机名互相找到对方。后面 TNS 里用的是主机名所以这一步不能省。第2步目标端配置静态监听执行位置目标端编辑listener.oracat EOF $ORACLE_HOME/network/admin/listener.ora SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DBNAME appdb) (ORACLE_HOME /u01/app/oracle/product/19c/dbhome_1) (SID_NAME appdb) ) ) EOF重启监听lsnrctl stop lsnrctl start lsnrctl status为什么目标端要配静态监听因为目标端现在还没有正式数据库这时候没有完整实例可供动态注册。所以要先配一个静态监听相当于提前给辅助实例留一个入口。第3步配置 TNS执行位置两端都要执行编辑tnsnames.oracat EOF $ORACLE_HOME/network/admin/tnsnames.ora APPDB_PROD (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST ora-prod)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME appdb) ) ) APPDB_DUP (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST ora-dup)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME appdb) ) ) EOF这两个别名分别表示APPDB_PROD源库连接名APPDB_DUP目标库连接名这样后面执行 RMAN 时直接写别名就可以不用写很长的连接描述。第4步测试 TNS 是否可用执行位置两端都建议测试tnsping APPDB_PROD tnsping APPDB_DUP这两个命令是用来测试 Oracle 网络连接是否打通的。tnsping APPDB_PROD测试能不能找到源库监听tnsping APPDB_DUP测试能不能找到目标库监听注意tnsping不是登录数据库。它只是检查TNS 配置是否正确主机名能不能解析端口和监听通不通如果这里不通后面的 Duplicate 基本也做不成。第5步源端导出 pfile执行位置源端先登录数据库sqlplus / as sysdba执行create pfile/home/oracle/pfile_appdb.ora from spfile;这句命令是什么意思它的作用是把源库当前正在使用的 spfile导出成一个可以编辑的文本参数文件 pfile。因为异机复制时目标端很多路径和参数不能直接照搬源库所以要先导出成 pfile再按目标端环境去修改。第6步编辑 pfile执行位置源端编辑文件/home/oracle/pfile_appdb.ora参考内容如下*.db_nameappdb *.compatible19.0.0 *.control_files/u01/oradata/appdb/control01.ctl,/u01/oradata/appdb/control02.ctl *.db_create_file_dest/u01/oradata *.log_archive_dest_1LOCATION/u01/archivelog *.audit_file_dest/u01/app/oracle/admin/appdb/adump *.diagnostic_dest/u01/app/oracle *.remote_login_passwordfileEXCLUSIVE *.sga_target2G *.pga_aggregate_target1G *.processes500 *.undo_tablespaceUNDOTBS1这里到底在哪边改这个点最容易绕。结论很直接pfile 在源端导出也建议直接在源端修改。改好之后再传到目标端。这样最顺也不容易乱。主要改什么重点改三类文件路径内存参数源库特有、不适合目标端的参数为什么不能直接照搬因为源端和目标端环境通常不一样比如数据文件路径不同归档路径不同内存大小不同某些本地参数不适合目标端所以这一步别偷懒。很多 Duplicate 失败坑就坑在参数文件。第7步把参数文件和密码文件传到目标端执行位置源端scp $ORACLE_HOME/dbs/orapwappdb 192.168.10.12:$ORACLE_HOME/dbs/ scp /home/oracle/pfile_appdb.ora 192.168.10.12:/home/oracle/这里复制两个关键文件密码文件目标端认证要用参数文件目标端启动辅助实例要用第8步目标端创建目录执行位置目标端mkdir -p /u01/oradata/appdb mkdir -p /u01/archivelog mkdir -p /u01/app/oracle/admin/appdb/adump这些目录要和 pfile 里配置的路径一致。如果目录不存在后面启动辅助实例或执行 Duplicate 时容易报错。第9步目标端启动辅助实例到 nomount执行位置目标端先登录sqlplus / as sysdba执行create spfile from pfile/home/oracle/pfile_appdb.ora; startup nomount;这里要理清楚这一步的逻辑是源端导出并修改 pfile目标端根据这个 pfile 生成 spfile然后在目标端把辅助实例启动到nomount为什么是nomount因为这时候目标端还只是一个辅助实例数据库本体还没有真正复制过来。所以现在只能先把“实例”拉起来等后面 RMAN 再把数据库内容复制进来。第10步为什么不能直接用sqlplus / as sysdba做 Duplicate很多人第一次都会有这个疑问。比如sqlplus / as sysdba这句命令的作用是本地登录当前机器上的数据库实例。它适合做查状态改参数启动实例执行 SQL所以前面的startup nomount很适合用它。但Duplicate 不是本地查库而是要同时连接源库同时连接目标库一边从源库读数据一边往目标库写数据这不是 SQL*Plus 的活而是RMAN 的活。所以这里要用rman target sys/密码APPDB_PROD auxiliary sys/密码APPDB_DUP它的意思是target连接源库auxiliary连接目标库你可以简单记成SQL*Plus 负责准备动作RMAN 负责真正复制。第11步执行 RMAN Duplicate执行位置目标端进入 RMANrman target sys/密码APPDB_PROD auxiliary sys/密码APPDB_DUP执行run { allocate channel prmy1 type disk; allocate channel prmy2 type disk; allocate auxiliary channel aux1 type disk; allocate auxiliary channel aux2 type disk; duplicate target database to appdb from active database nofilenamecheck; }这里推荐写成这种完整连接方式原因很简单直观不容易把源库和目标库搞混。第12步这段 Duplicate 命令怎么理解核心看这几句duplicate target database to appdb from active database nofilenamecheck;duplicate target database to appdb把源库复制成一个新的appdb数据库。from active database直接从在线源库复制不依赖提前备份。这就是 Active Database Duplicate 的核心。nofilenamecheck不检查源端和目标端文件名是否冲突。异机复制时常用。如果是同机复制或者路径没规划清楚这个参数要慎用。第13步为什么还要写allocate channel这几句allocate channel prmy1 type disk; allocate channel prmy2 type disk; allocate auxiliary channel aux1 type disk; allocate auxiliary channel aux2 type disk;作用可以理解成给 RMAN 分配搬运数据的通道。prmy通道从源库读取数据aux通道往目标库写入数据多个通道可以并行处理速度更快。但也不是越多越好还是要看主机和存储性能。第14步复制完成后检查执行位置目标端先登录sqlplus / as sysdba执行select instance_name, status from v$instance; select name, open_mode from v$database;如果是 CDB 环境再执行show pdbs;主要看v$instance实例是否正常启动v$database数据库是否正常打开show pdbsPDB 是否正常打开七、最容易踩的坑1目标端没配静态监听辅助实例连不上。2TNS 不通RMAN 无法连接源库或目标库。3密码文件没复制远程认证失败。4pfile 不知道在哪边改这里再强调一次pfile 在源端导出也建议在源端修改改好之后再传到目标端使用。5目标端目录没提前创建Duplicate 过程中报路径错误。6目标端空间不足复制做到一半翻车前面全白干。八、总结RMAN Duplicate 可以直接理解成把源库自动复制到另一台机器上生成一套新的可用数据库。它特别适合搭测试库做异机复制做恢复验证做演练环境实操时记住这条主线就够了源端导出并修改参数文件 → 目标端准备辅助实例 → RMAN 执行 Duplicate最关键的一点再强调一遍源端负责准备目标端负责接收RMAN 负责把两边连起来完成复制这样一拆开整个流程就不会乱。

更多文章