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 看起来步骤多,核心流程其实就这些:
-
两端配置 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.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 负责把两边连起来完成复制
这样一拆开,整个流程就不会乱。