Oracle 高可用架构实战:RAC + Data Guard + GoldenGate 全景教程
Oracle 提供了业界最完整的高可用架构体系。本文用一篇文章讲透 RAC、Data Guard、GoldenGate 三大核心组件,让你能根据业务需求选择最合适的方案。

一句话总结
Oracle 高可用 = RAC (节点级容错)+ Data Guard (站点级灾备)+ GoldenGate(异构同步),三者可组合使用,覆盖从单机房到跨地域的全场景高可用需求。
一、为什么需要 Oracle 高可用?
数据库宕机一分钟,企业损失可能上百万。Oracle 高可用架构解决三个核心问题:
| 问题 | 解决方案 | 目标 |
|---|---|---|
| 服务器/存储故障 | RAC(Real Application Clusters) | 节点故障自动切换,RTO ≈ 0 |
| 机房/城市级灾难 | Data Guard | 主备同步,RPO ≈ 0 |
| 异构迁移/读写分离 | GoldenGate | 实时复制,跨平台同步 |
二、Oracle RAC:多节点并行集群
2.1 什么是 RAC?
RAC(Real Application Clusters)是 Oracle 的核心高可用组件,允许多个数据库实例同时访问同一个共享数据库存储,提供:
- 故障透明切换:一个节点宕机,其他节点自动接管
- 负载均衡:连接分发到多个节点,提升吞吐
- 在线扩展:加节点不停机
2.2 RAC 架构图
┌──────────────────────────────────┐
│ 应用 / 中间件 │
│ (TNS 负载均衡配置) │
└──────┬───────────┬───────────────┘
│ │
┌──────────▼──┐ ┌───▼──────────┐
│ Instance 1 │ │ Instance 2 │
│ (Node 1) │ │ (Node 2) │
│ SID: orcl1 │ │ SID: orcl2 │
└──────┬───────┘ └──┬───────────┘
│ │
│ Cache Fusion (私有网络)
├───────────────┤
│ │
┌──────▼───────────────▼───────────┐
│ 共享存储 (ASM / 共享磁盘) │
│ ┌────────┬────────┬────────┐ │
│ │DATAFILE│CONTROL │REDO │ │
│ │ │FILE │LOG │ │
│ └────────┴────────┴────────┘ │
└──────────────────────────────────┘
2.3 核心组件
| 组件 | 作用 |
|---|---|
| Grid Infrastructure | 集群管理层,包含 Clusterware 和 ASM |
| ASM(Automatic Storage Management) | 自动存储管理,替代传统文件系统 |
| Voting Disk | 集群成员仲裁,防止脑裂 |
| OCR(Oracle Cluster Registry) | 集群配置注册表 |
| Cache Fusion | 节点间数据块传输,通过私有网络 |
| SCAN(Single Client Access Name) | 单一接入点,客户端不感知节点变化 |
2.4 搭建 RAC 的关键步骤
bash
# 1. 环境准备(两个节点都要做)
# 关闭防火墙和 SELinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 配置 /etc/hosts
cat >> /etc/hosts << EOF
# Public
192.168.1.101 rac1
192.168.1.102 rac2
# Private (Interconnect)
10.0.0.101 rac1-priv
10.0.0.102 rac2-priv
# VIP
192.168.1.201 rac1-vip
192.168.1.202 rac2-vip
# SCAN
192.168.1.100 rac-scan
EOF
# 2. 安装 Grid Infrastructure
# 解压并运行
cd /u01/app/19c/grid
./gridSetup.sh
# 3. 安装 Oracle Database 软件(仅安装,不建库)
cd /u01/app/oracle/product/19c/dbhome_1
./runInstaller
# 4. 用 DBCA 创建 RAC 数据库
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName orcl -sid orcl \
-createAsContainerDatabase true \
-sysPassword xxxxx -systemPassword xxxxx \
-storageType ASM \
-diskGroupName +DATA \
-nodeinfo rac1,rac2
2.5 检查 RAC 状态
bash
# 检查集群状态
crsctl stat res -t
# 检查数据库实例
srvctl status database -d orcl
# 查看 RAC 节点信息
olsnodes -n
# 查看 ASM 磁盘组
asmcmd lsdg
# 检查 Cache Fusion 状态(互联网络)
oifcfg getif
2.6 配置客户端负载均衡
plaintext
# tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
SCAN 是 RAC 的单一接入点,客户端只需连 SCAN 地址,Oracle 自动分发连接。
三、Oracle Data Guard:异地灾备
3.1 什么是 Data Guard?
Data Guard 是 Oracle 的灾备方案,通过维护一个或多个 Standby(备库) 来保护主库(Primary)的数据安全。
保护模式:
| 模式 | 数据安全性 | 性能影响 | RPO |
|---|---|---|---|
| Maximum Performance(默认) | 中 | 最小 | 可能丢少量数据 |
| Maximum Availability | 高 | 低 | 正常情况下不丢 |
| Maximum Protection | 最高 | 中 | 绝对不丢 |
3.2 两种备库类型
| 类型 | 说明 | 优势 |
|---|---|---|
| Physical Standby | 物理备库,块级复制,Redo Apply | 数据一致性最高,性能最好 |
| Logical Standby | 逻辑备库,SQL Apply | 备库可读可写,支持异构 |
3.3 搭建 Physical Standby 步骤
主库配置:
sql
-- 1. 开启归档模式
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 2. 开启 Force Logging
ALTER DATABASE FORCE LOGGING;
-- 3. 配置 Redo 传输参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
-- 4. 创建 Standby Redo Log(比 Online Redo Log 多一组)
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 4 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 6 SIZE 200M;
-- 5. 配置 FAL(自动缺口解决)
ALTER SYSTEM SET FAL_SERVER='standby' SCOPE=BOTH;
ALTER SYSTEM SET FAL_CLIENT='primary' SCOPE=BOTH;
-- 6. 配置 TNS
-- 编辑 tnsnames.ora,添加 standby 的连接串
创建备库:
bash
# 方法一:用 RMAN 从活动数据库复制(推荐,11g+)
rman TARGET sys/xxxxx@primary AUXILIARY sys/xxxxx@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
NOFILENAMECHECK;
# 方法二:用 RMAN 备份恢复
# 先在主库备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
# 将备份传到备库服务器,恢复
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
启动备库 Redo Apply:
sql
-- 在备库执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- 验证同步状态
SELECT THREAD#, SEQUENCE#, STATUS FROM V$MANAGED_STANDBY;
3.4 Active Data Guard(ADG)
普通 Data Guard 的备库只能处于 MOUNT 状态。Active Data Guard(需付费许可)允许备库在 Redo Apply 的同时以只读模式打开,实现:
- 读写分离:查询负载分流到备库
- 报表卸载:报表查询不影响主库性能
- 备份卸载:RMAN 备份可以在备库执行
sql
-- 开启 Active Data Guard
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
-- 验证
SELECT OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;
-- 应显示: READ ONLY WITH APPLY / PHYSICAL STANDBY
3.5 Switchover 与 Failover
sql
-- Switchover(计划性切换,无数据丢失)
-- 在主库执行
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;
-- 在备库执行
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;
-- Failover(非计划性切换,主库不可用时)
-- 在备库执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;
-- Data Guard Broker 方式(更简单)
DGMGRL> SWITCHOVER TO standby;
DGMGRL> FAILOVER TO standby;
3.6 Data Guard 监控
sql
-- 检查 Redo 传输延迟
SELECT NAME, VALUE, DATUM_TIME
FROM V$DATAGUARD_STATS
WHERE NAME IN ('transport lag', 'apply lag');
-- 检查归档传输状态
SELECT DEST_ID, STATUS, ERROR
FROM V$ARCHIVE_DEST
WHERE DEST_ID IN (1, 2);
-- 查看 Redo Apply 进度
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS
FROM V$MANAGED_STANDBY;
-- 检查 GAP(归档缺口)
SELECT * FROM V$ARCHIVE_GAP;
四、Oracle GoldenGate:异构实时同步
4.1 什么是 GoldenGate?
GoldenGate 是 Oracle 的数据复制工具,支持:
- 异构数据库同步:Oracle → MySQL / PostgreSQL / SQL Server / Kafka
- 实时复制:基于 Redo Log / Archive Log 的 CDC(变更数据捕获)
- 双向复制:多活架构
- 选择性复制:只同步特定表/列
4.2 GoldenGate 架构
源端 目标端
┌─────────────────┐ ┌──────────────────┐
│ Source DB │ │ Target DB │
│ (Oracle) │ │ (MySQL/Kafka) │
└────────┬────────┘ └────────▲─────────┘
│ │
┌────────▼────────┐ ┌────────┴─────────┐
│ Extract 进程 │ │ Replicat 进程 │
│ (捕获变更) │ │ (应用变更) │
└────────┬────────┘ └────────▲─────────┘
│ │
│ ┌─────────────────────────┐ │
└─►│ Trail Files (传输文件) ├────────┘
└─────────────────────────┘
4.3 配置 GoldenGate(Oracle → Oracle 单向复制)
源端配置:
sql
-- 1. 开启数据库补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 2. 创建 GoldenGate 用户
CREATE USER oggadmin IDENTIFIED BY xxxxx;
GRANT DBA TO oggadmin;
bash
# 3. 启动 GGSCI 配置
cd /u01/goldengate
./ggsci
GGSCI> DBLOGIN USERID oggadmin, PASSWORD xxxxx
# 4. 配置 Extract 进程
GGSCI> ADD EXTRACT ext1, TRANLOG, BEGIN NOW
GGSCI> ADD EXTTRAIL ./dirdat/et, EXTRACT ext1
GGSCI> EDIT PARAMS ext1
EXTRACT ext1
USERID oggadmin, PASSWORD xxxxx
RMTHOST target_host, MGRPORT 7809
RMTTRAIL ./dirdat/rt
TABLE hr.employees;
TABLE hr.departments;
# 5. 配置 Data Pump(可选,用于传输 Trail 文件)
GGSCI> ADD EXTRACT pump1, EXTTRAILSOURCE ./dirdat/et
GGSCI> ADD RMTTRAIL ./dirdat/rt, EXTRACT pump1
# 6. 启动
GGSCI> START EXTRACT ext1
GGSCI> START EXTRACT pump1
目标端配置:
bash
GGSCI> DBLOGIN USERID oggadmin, PASSWORD xxxxx
# 1. 配置 Replicat 进程
GGSCI> ADD REPLICAT rep1, EXTTRAIL ./dirdat/rt
GGSCI> EDIT PARAMS rep1
REPLICAT rep1
USERID oggadmin, PASSWORD xxxxx
MAP hr.employees, TARGET hr.employees;
MAP hr.departments, TARGET hr.departments;
# 2. 启动
GGSCI> START REPLICAT rep1
4.4 GoldenGate 监控
bash
GGSCI> INFO ALL -- 查看所有进程状态
GGSCI> INFO EXTRACT ext1 -- Extract 详情
GGSCI> STATS EXTRACT ext1 -- 统计信息
GGSCI> LAG EXTRACT ext1 -- 延迟信息
GGSCI> VIEW REPORT ext1 -- 查看报告
五、方案对比与选型指南
| 维度 | RAC | Data Guard | GoldenGate |
|---|---|---|---|
| 解决问题 | 节点故障 | 站点灾难 | 异构同步 |
| 数据一致性 | 完全一致 | 近实时(取决于模式) | 近实时 |
| 切换时间 | 自动(秒级) | 手动/自动(分钟级) | 无需切换 |
| 性能影响 | Cache Fusion 开销 | Redo 传输开销 | 解析 Redo 开销 |
| 备库可用性 | 所有节点可读写 | 只读(ADG)或不可用 | 目标库可读写 |
| 许可证费用 | RAC 许可 | 包含在 EE 中 | ADG/GG 单独收费 |
| 搭建复杂度 | 高(共享存储+集群) | 中 | 中 |
| 适用场景 | 7×24 核心业务 | 灾备/读写分离 | 异构迁移/数据仓库 |
最佳组合方案
┌─ RAC Node 1 ─┐
Primary Site: │ ├─ Shared ASM ─┐
└─ RAC Node 2 ─┘ │
│
Data Guard (Async/Sync) │
│
┌─ RAC Node 1 ─┐ │
Standby Site: │ ├─ Shared ASM ─┘
└─ RAC Node 2 ─┘
│
GoldenGate (异构同步)
│
┌───────────┼───────────┐
▼ ▼ ▼
MySQL PostgreSQL Kafka
(Web应用) (报表系统) (数据湖)
六、生产环境最佳实践
6.1 RAC 注意事项
- 互联网络:必须使用私有高速网络(至少 1Gbps,推荐 10Gbps)
- ASM 磁盘组:DATA 和 FRA 分开,使用 Normal Redundancy
- 服务管理:为不同应用创建不同 Service,实现负载隔离
- 节点驱逐:配置 I/O Fencing,防止脑裂
6.2 Data Guard 注意事项
- 保护模式选择:金融系统用 Maximum Availability,一般业务用 Maximum Performance
- Standby Redo Log:大小与 Online Redo Log 一致,数量多一组
- 网络带宽:评估 Redo 生成速率,确保网络能支撑传输
- 定期演练:每季度做一次 Switchover 演练,验证灾备有效性
- 监控告警:设置 transport lag 和 apply lag 阈值告警
6.3 GoldenGate 注意事项
- 补充日志:确保源库开启必要的补充日志
- DDL 复制 :需要单独配置 DDL 支持(
DDL INCLUDE) - 冲突解决:双向复制需要配置冲突检测和解决策略
- Trail 文件清理:定期清理旧的 Trail 文件,防止磁盘满
七、常见故障排查
7.1 RAC 脑裂(Split-Brain)
bash
# 现象:两个节点都认为对方已死,各自独立运行
# 检查 Voting Disk
crsctl query css votedisk
# 检查节点状态
olsnodes -n -s
# 解决:Voting Disk 仲裁,少数派节点会被自动驱逐
# 预防:确保互联网络稳定,配置 I/O Fencing
7.2 Data Guard Redo 传输失败
sql
-- 检查错误
SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS;
-- 常见原因:
-- 1. 网络不通 → 检查防火墙和 TNS 连通性
-- 2. 密码文件不同步 → 用 orapwd 重新生成并拷贝
-- 3. 归档缺口 → 手动传输缺失的归档日志
7.3 GoldenGate 延迟过大
bash
# 检查延迟
GGSCI> LAG EXTRACT ext1
GGSCI> LAG REPLICAT rep1
# 常见原因:
# 1. 大事务 → 拆分大事务或使用 INTEGRATED 模式
# 2. 网络带宽不足 → 压缩 Trail 文件或增加带宽
# 3. 目标端性能问题 → 优化目标端索引和触发器
八、Oracle 高可用架构版本演进
| 版本 | 关键特性 |
|---|---|
| 11g | Active Data Guard、GoldenGate 集成 |
| 12c | Multitenant(CDB/PDB)、Application Continuity |
| 19c | Automatic Indexing、Real-Time Statistics、ADG DML 重定向 |
| 23ai | AI 优化、JSON 关系二元性、微服务集成增强 |
九、总结
| 需求 | 推荐方案 | 备注 |
|---|---|---|
| 服务器故障不中断 | RAC | 需要共享存储 |
| 机房灾难不丢数据 | Data Guard Max Protection | 同步模式,性能有影响 |
| 机房灾难可接受少量延迟 | Data Guard Max Performance | 异步模式,性能最好 |
| 读写分离/报表卸载 | Active Data Guard | 需 ADG 许可 |
| Oracle → MySQL 迁移 | GoldenGate | 支持异构 |
| 全场景高可用 | RAC + DG + GG | 最完整但也最贵 |
系列文章
:Oracle 高可用不是一套方案打天下。小公司用 Data Guard 就够了,金融系统必须 RAC + DG,异构迁移离不开 GoldenGate。选对方案,比会搭更重要。