Oracle RAC 级联物理备库搭建
📘 Oracle RAC 级联物理备库搭建
目标:从零开始,在已有主库(
yewue)和容灾备库(stdyewue)的基础上,搭建一个级联备库(zxyewue)。
环境:Oracle 19c RAC + ASM + Linux
方法:RMAN FROM SERVICE(无需备份文件)
第一阶段:理解架构与命名(Why)
✅ 为什么要严格定义 db_name 和 db_unique_name?
db_name:数据库的“身份证号”,所有 DG 成员必须完全一致。Oracle 用它识别是否属于同一个数据库。db_unique_name:数据库的“全名”,用于网络通信和日志路由,必须全局唯一。
主库: db_name=yewue, db_unique_name=yewue
容灾库: db_name=yewue, db_unique_name=stdyewue
级联库: db_name=yewue, db_unique_name=zxyewue ← 新建
🔥 如果
db_name不一致,RMAN 恢复会直接报错:ORA-19504: failed to create file。
第二阶段:清理目标环境(Where & What)
目标机器:
10.230.171.53(节点1)、10.230.171.54(节点2)
假设旧实例名为zxyewue或zxacctg
步骤1:关闭可能运行的数据库实例
su - oracle
sqlplus / as sysdba <<EOF
SHUTDOWN IMMEDIATE;
EXIT;
EOF
- 作用:安全关闭数据库,防止数据损坏。
- 原理:
SHUTDOWN IMMEDIATE会回滚未提交事务并关闭实例。 - 风险:如果数据库已宕机,此命令会报错,可忽略。
步骤2:清理 ASM 中的数据(关键!)
su - grid
asmcmd -p
asmcmd:ASM 命令行工具,用于管理 ASM 磁盘组中的文件。-p:显示提示符(如ASMCMD>),方便交互。
ASMCMD> cd +DATADG
ASMCMD> ls
- 作用:查看
DATADG磁盘组内容。你会看到类似yewue/,STDyewue/,ZXyewue/的目录。 - 注意:ASM 自动将
db_unique_name转为大写存储。
ASMCMD> rm -rf ZXyewue
- 作用:递归删除整个
ZXyewue目录(包含控制文件、数据文件、临时文件等)。 - ⚠️ 高危操作:确保删除的是目标实例,不是其他库!
ASMCMD> cd +ARCHDG
ASMCMD> rm -rf ZXyewue
- 作用:删除归档日志目录,避免旧日志干扰新同步。
ASMCMD> exit
步骤3:清理 CRS(Cluster Ready Services)注册信息
srvctl status database -d zxyewue
- 作用:检查集群中是否注册了
zxyewue数据库。 - 输出示例:
- 若存在:
Database zxyewue is running... - 若不存在:
PRCD-1229 : ...
- 若存在:
srvctl remove database -d zxyewue -f
- 作用:强制从集群配置中移除该数据库。
-f:即使数据库正在运行也强制移除(慎用!但我们已 shutdown)。- 原理:CRS 通过
srvctl管理数据库生命周期。不清理会导致后续srvctl add失败。
第三阶段:网络配置(How to Connect)
步骤4:配置 tnsnames.ora(客户端连接串)
文件路径:$ORACLE_HOME/network/admin/tnsnames.ora(两节点都要配)
STD_yewue =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.230.171.153)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.230.171.154)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stdyewue) # ← 这是容灾库的 db_unique_name
)
)
- 作用:让级联库能通过别名
STD_yewue连接到容灾库。 SERVICE_NAME:必须等于容灾库的db_unique_name(不是db_name!)。ADDRESS_LIST:RAC 双节点,实现负载均衡/故障转移。
STD_ZX_yewue =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.230.171.53)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.230.171.54)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = zxyewue) # ← 级联库自己的 db_unique_name
)
)
- 作用:供 FAL(Fetch Archive Log)机制使用。当级联库缺少日志时,会通过此 TNS 向上一级请求。
✅ 验证:
tnsping std_yewue # 应返回 OK tnsping std_zx_yewue # 应返回 OK
步骤5:配置静态监听(让远程能连上来)
编辑 $GRID_HOME/network/admin/listener.ora:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = zxyewue) # ← db_unique_name
(ORACLE_HOME = /oracle/app/oracle/product/19c/db_1)
(SID_NAME = yewue1) # ← 实例名(节点1)
)
(SID_DESC =
(GLOBAL_DBNAME = zxyewue)
(ORACLE_HOME = /oracle/app/oracle/product/19c/db_1)
(SID_NAME = yewue2) # ← 实例名(节点2)
)
)
- 作用:在数据库未启动时,也能通过监听注册服务(动态注册需要数据库启动后才生效)。
GLOBAL_DBNAME:必须等于db_unique_name。SID_NAME:RAC 实例名,通常为<db_name><node#>。
lsnrctl stop
lsnrctl start
lsnrctl status
- 验证:输出中应包含
Service "zxyewue"has 1 instance(s).
第四阶段:参数文件(The Brain)
步骤6:获取并精简 PFILE
在主库执行:
CREATE PFILE='/tmp/pfile_yewue_20260330.ora' FROM SPFILE;
- 作用:导出当前运行参数,作为模板。
- 为什么不用容灾库的 PFILE? 因为主库参数最完整(容灾库有些参数是只读的)。
传到级联库后,只保留以下核心参数(删除其余):
*.db_name='yewue' # ← 必须与主库一致!
*.db_unique_name='zxyewue' # ← 全局唯一!
*.db_create_file_dest='+DATADG' # ← OMF 关键!自动管理文件路径
*.fal_client='std_zx_yewue' # ← 自己的 TNS 别名
*.fal_server='std_yewue' # ← 上一级备库的 TNS 别名
*.log_archive_config='DG_CONFIG=(yewue,stdyewue,zxyewue)' # ← 所有成员
*.log_archive_dest_1='LOCATION=+ARCHDG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=zxyewue'
*.log_archive_dest_2='SERVICE=std_yewue ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stdyewue'
*.standby_file_management='AUTO' # ← 自动创建数据文件
🔥 致命错误规避:
- 不要加
db_file_name_convert='+DATADG/yewue/', '+DATADG/ZXyewue/'
→ 因为主库用 OMF,路径是随机的(如+DATADG/yewue/DATAFILE/SYSTEM.256.1),无法映射!
第五阶段:密码与目录(Security & Structure)
步骤7:创建 adump 目录
mkdir -p /oracle/app/oracle/admin/zxyewue/adump
chown oracle:oinstall /oracle/app/oracle/admin/zxyewue/adump
- 作用:存放审计日志(audit trail)。若不存在,数据库启动会报错。
步骤8:上传密码文件到 ASM
# 从容灾库拷贝(确保密码一致)
scp oracle@10.230.171.153:$ORACLE_HOME/dbs/orapwyewue1 /tmp/
# 上传到 ASM
asmcmd -p
ASMCMD> pwcopy /tmp/orapwyewue1 +DATADG/ZXyewue/PASSWORD/orapwzxyewue
pwcopy:ASM 专用命令,用于上传密码文件。- 文件名:建议
orapw<db_unique_name>(小写),便于识别。
第六阶段:集群注册(Orchestration)
步骤9:创建 SPFILE 并注册
-- 启动到 NOMOUNT(使用 PFILE)
STARTUP NOMOUNT PFILE='/home/oracle/pfile_zxyewue.ora';
-- 创建 SPFILE 到 ASM
CREATE SPFILE='+DATADG/ZXyewue/spfilezxyewue.ora' FROM PFILE='/home/oracle/pfile_zxyewue.ora';
SHUTDOWN IMMEDIATE;
- 作用:将文本 PFILE 转为二进制 SPFILE,并存入 ASM(高可用)。
# 注册到集群
srvctl add database -db zxyewue \
-spfile '+DATADG/ZXyewue/spfilezxyewue.ora' \
-pwfile '+DATADG/ZXyewue/PASSWORD/orapwzxyewue' \
-dbname yewue \
-role PHYSICAL_STANDBY \
-startoption MOUNT
srvctl add instance -db zxyewue -instance yewue1 -node kdjfb1
srvctl add instance -db zxyewue -instance yewue2 -node kdjfb2
-role PHYSICAL_STANDBY:标记为物理备库,CRS 会以 MOUNT 模式启动。-startoption MOUNT:启动时不 OPEN,符合备库要求。
第七阶段:RMAN 恢复(The Heart)
步骤10:恢复控制文件
RMAN> RESTORE STANDBY CONTROLFILE FROM SERVICE 'std_yewue';
- 作用:从容灾库拉取最新的控制文件(包含数据文件结构)。
- 为什么是 STANDBY? 因为我们要建的是 standby,控制文件类型必须匹配。
RMAN> SHUTDOWN;
RMAN> STARTUP MOUNT;
- MOUNT 状态:加载控制文件,但不打开数据文件,适合恢复操作。
步骤11:全量恢复数据(核心脚本详解)
#!/bin/bash
rman target / <<EOF
RUN {
ALLOCATE CHANNEL c1 TYPE DISK; -- 分配8个通道,并行加速
...
ALLOCATE CHANNEL c8 TYPE DISK;
SET NEWNAME FOR DATABASE TO NEW; -- 关键!OMF 模式下,让 ASM 自动生成路径
RESTORE DATABASE FROM SERVICE 'std_yewue' SECTION SIZE 64G;
-- 从远程服务恢复
-- SECTION SIZE:大文件分段传输,避免单次 IO 过大
SWITCH DATAFILE ALL; -- 更新控制文件:将 NEWNAME 路径设为正式路径
RELEASE CHANNEL c1; ... -- 释放通道
}
EOF
SET NEWNAME FOR DATABASE TO NEW:
告诉 RMAN:“不要用原路径,让 Oracle 自己决定新路径(即db_create_file_dest)”。SWITCH DATAFILE ALL:
控制文件中原路径是+DATADG/yewue/...,现在要更新为+DATADG/ZXyewue/...。
步骤12:应用增量 Redo
RECOVER DATABASE FROM SERVICE 'std_yewue' NOREDO;
- 作用:应用从全量恢复结束到现在的所有 Redo 日志。
NOREDO:因为这是 standby,不需要应用最后的在线 Redo(主库才有)。
第八阶段:Standby Redo Log(The Buffer)
步骤13:添加 Standby Redo Log
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 131 ('+DATADG') SIZE 5G;
...
- 为什么需要 SRL?
备库接收 Redo 时,先写入 SRL,再由 MRP 进程应用到数据文件。没有 SRL,只能等归档完成才应用(延迟高)。 - 数量要求:≥ 主库每线程 Online Redo 组数 + 1(防切换时不够用)。
第九阶段:启动与验证(Go Live)
步骤14:启动实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE
DISCONNECT FROM SESSION;
USING CURRENT LOGFILE:开启 Real-Time Apply,Redo 写入 SRL 后立即应用(延迟 < 1 秒)。DISCONNECT:后台运行,不占用当前会话。
步骤15:全面验证
-- 1. 检查进程
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;
-- MRP0 状态应为 APPLYING_LOG
-- 2. 检查日志应用
SELECT MAX(SEQUENCE#) FROM V$LOG_HISTORY; -- 已应用的最大序号
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES'; -- 同上
-- 3. 检查 GAP
SELECT * FROM V$ARCHIVE_GAP; -- 应无结果
-- 4. 检查错误
SELECT MESSAGE FROM V$DATAGUARD_STATUS WHERE TIMESTAMP > SYSDATE - 1/24;
总结:每一步的意义
| 步骤 | 命令/脚本 | 核心目的 |
|---|---|---|
| 清理 | asmcmd rm -rf |
避免旧数据冲突 |
| 网络 | tnsnames.ora |
建立通信桥梁 |
| 参数 | PFILE 精简 | 定义角色与路由 |
| 密码 | pwcopy |
确保认证一致 |
| 集群 | srvctl add |
纳入高可用管理 |
| RMAN | RESTORE ... FROM SERVICE |
零备份搭建 |
| SRL | ADD STANDBY LOGFILE |
实现实时同步 |
| 验证 | V$MANAGED_STANDBY |
确认成功 |
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 龙羽

