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 常见可以分成 两大类

1)Active Database Duplicate

这种方式是 直接从正在运行的源库,通过网络复制到目标端,不需要提前准备 RMAN 备份。

它的特点是:

  • 源库在线即可执行

  • 不需要先备份、再传备份文件

  • 操作流程更直接

  • 适合搭测试库、异机复制、恢复演练

2)Backup-based Duplicate

这种方式是 先基于已有的 RMAN 备份,再在目标端恢复出一套新库

它的特点是:

  • 需要提前有可用备份

  • 适合网络带宽有限的场景

  • 也适合源库当前不方便直接连接,但备份仍可用的场景


二、本文演示的是最常用的一种

Active Database Duplicate

也就是:

不需要提前备份源库,直接通过网络把源库复制到目标端。

对于日常运维来说,这种方式更直接,也更适合实战。


三、实验环境

为了适合公开发博客,示例环境统一如下:

角色 主机名 IP Oracle版本 说明
源库 ora-prod 192.168.10.11 19c 已存在业务数据库
目标库 ora-dup 192.168.10.12 19c 只安装 Oracle 软件,未建库

数据库名统一示例为:

复制代码
appdb

TNS 别名统一为:

复制代码
APPDB_PROD   -- 源库连接名
APPDB_DUP    -- 目标库连接名

四、做 Duplicate 前要满足什么条件?

开始前先确认这些条件:

  • 源端和目标端 Oracle 主版本一致

  • 目标端只安装 Oracle 软件,不需要提前建库

  • 目标端磁盘空间不能小于源端

  • 两台服务器网络互通

  • 源库建议开启归档模式

  • 两端监听正常

  • 源库和目标库都能通过 TNS 连接

说白了:

Duplicate 真正难的,不是命令本身,而是前置条件没准备好。


五、整个流程其实就 5 步

RMAN Duplicate 看起来步骤多,核心流程其实就这些:

  1. 两端配置 hosts

  2. 目标端配置静态监听

  3. 两端配置 TNS

  4. 源端导出并修改 pfile,再传到目标端

  5. 目标端启动到 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.ora

复制代码
cat <<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.ora

复制代码
cat <<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_name='appdb'
*.compatible='19.0.0'
*.control_files='/u01/oradata/appdb/control01.ctl','/u01/oradata/appdb/control02.ctl'
*.db_create_file_dest='/u01/oradata'
*.log_archive_dest_1='LOCATION=/u01/archivelog'
*.audit_file_dest='/u01/app/oracle/admin/appdb/adump'
*.diagnostic_dest='/u01/app/oracle'
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2G
*.pga_aggregate_target=1G
*.processes=500
*.undo_tablespace='UNDOTBS1'

这里到底在哪边改?

这个点最容易绕。

结论很直接:

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

执行位置:目标端

进入 RMAN:

复制代码
rman 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 pdbs:PDB 是否正常打开


七、最容易踩的坑

1)目标端没配静态监听

辅助实例连不上。

2)TNS 不通

RMAN 无法连接源库或目标库。

3)密码文件没复制

远程认证失败。

4)pfile 不知道在哪边改

这里再强调一次:

pfile 在源端导出,也建议在源端修改;改好之后,再传到目标端使用。

5)目标端目录没提前创建

Duplicate 过程中报路径错误。

6)目标端空间不足

复制做到一半翻车,前面全白干。


八、总结

RMAN Duplicate 可以直接理解成:

把源库自动复制到另一台机器上,生成一套新的可用数据库。

它特别适合:

  • 搭测试库

  • 做异机复制

  • 做恢复验证

  • 做演练环境

实操时记住这条主线就够了:

源端导出并修改参数文件 → 目标端准备辅助实例 → RMAN 执行 Duplicate

最关键的一点再强调一遍:

  • 源端负责准备

  • 目标端负责接收

  • RMAN 负责把两边连起来完成复制

这样一拆开,整个流程就不会乱。

相关推荐
海兰2 小时前
【实战】详解本地图书馆MCP服务 —注册到Nacos指南
运维·服务器·dubbo·银行ai
姚永强2 小时前
客户端同步服务器实验
运维·服务器
H_z_q24012 小时前
IP-vlan综合实验
运维·服务器
刘~浪地球2 小时前
Redis 从入门到精通(七):集合操作详解
数据库·chrome·redis
光泽雨2 小时前
SQL分组Group By
数据库
数据知道2 小时前
claw-code 源码详细分析:子系统目录地图——几十个顶层包如何用五条轴(会话 / 工具 / 扩展 / 入口 / 桥接)读懂?
服务器·python·ai·claude code
zfoo-framework2 小时前
[推荐]ansible在主控机执行实现多个worker机器免密登录
linux·运维·ansible
i建模2 小时前
华为MateBook X Pro 2020款在Ubuntu系统中直接使用原生的杜比全景声效果
linux·ubuntu·华为
Flamingˢ2 小时前
YNQ + OV5640 视频系统开发(二):OV5640_Data IP 核源码解析
arm开发·嵌入式硬件·网络协议·tcp/ip·fpga开发·vim·音视频