高可用方案
最后更新: 2026-04-15
作者: Oracle Team
页面目录
第十六章:高可用方案
文档信息
- 适用版本:Oracle 12c / 18c / 19c / 21c
- 阅读时间:约 60 分钟
- 前置知识:第十二章 DataGuard
16.1 高可用概述
16.1.1 高可用架构层次
┌─────────────────────────────────────────────────────────────────┐
│ Oracle 高可用层次 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 应用层 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 负载均衡 / 故障转移 / 连接池 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 数据库层 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Oracle RAC / Data Guard │ │
│ │ • RAC: 节点级高可用 │ │
│ │ • DG: 站点级高可用 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 存储层 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ASM / RAID / 存储复制 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 网络层 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 冗余网络 / 私有网络 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
16.1.2 高可用指标
| 指标 | 说明 | 计算方式 |
|---|---|---|
| 可用性 | 系统正常运行时间比例 | (总时间 - 停机时间) / 总时间 |
| MTBF | 平均无故障时间 | 正常运行时间 / 故障次数 |
| MTTR | 平均恢复时间 | 总停机时间 / 故障次数 |
| RPO | 恢复点目标 | 最大可容忍数据丢失时间 |
| RTO | 恢复时间目标 | 系统恢复所需时间 |
常用高可用目标:
• 99.9% 可用性 → 年停机时间 < 8.76 小时
• 99.99% 可用性 → 年停机时间 < 52.6 分钟
• 99.999% 可用性 → 年停机时间 < 5.26 分钟
16.2 Oracle RAC
16.2.1 RAC 架构
┌─────────────────────────────────────────────────────────────────┐
│ Oracle RAC 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 客户端应用层 │ │
│ │ 负载均衡 + 故障转移 (TAF/FAN) │ │
│ └────────────────────────┬─────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼─────────────────────────────────────┐ │
│ │ SCAN Listener │ │
│ │ (Single Client Access Name) │ │
│ └────────┬────────────────────────────────────┬─────────────────┘ │
│ │ │ │
│ ┌────────▼────────┐ ┌───────────▼────────────┐ │
│ │ Node 1 │ │ Node 2 │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │Local Listener│ │ │ │Local Listener│ │ │
│ │ └─────┬──────┘ │ │ └─────┬──────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌─────▼──────┐ │ │ ┌─────▼──────┐ │ │
│ │ │ Instance1 │ │ │ │ Instance2 │ │ │
│ │ └─────┬──────┘ │ │ └─────┬──────┘ │ │
│ └───────┼────────┘ └───────┼────────────────┘ │
│ │ │ │
│ ┌───────▼──────────────────────────────────▼─────────────────┐ │
│ │ Clusterware (GI) │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ OCR │ │ Voting │ │ CRS │ │ │
│ │ │ (配置信息) │ │ Disk │ │ (资源) │ │ │
│ │ └──────────────┘ │ (表决) │ └──────────────┘ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼──────────────────────────────────┐ │
│ │ 共享存储 │ │
│ │ (ASM / NFS / FC SAN) │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
16.2.2 RAC 核心组件
| 组件 | 说明 |
|---|---|
| Clusterware | 集群软件,管理节点 |
| OCR | Oracle Cluster Registry,存储集群配置 |
| Voting Disk | 表决盘,节点心跳 |
| SCAN | Single Client Access Name,简化连接 |
| GNS | Grid Naming Service,动态注册 |
| VIP | 虚拟 IP,节点故障转移 |
| Private Network | 私有网络,节点间通信 |
16.2.3 RAC 常用命令
# Grid Infrastructure 命令
# 查看集群状态
crsctl stat res -t
crsctl status resource -w "TYPE co'cluster'" -v
# 查看集群节点
olsnodes -n
srvctl status nodeapps -n racnode1
# 查看 SCAN 状态
srvctl config scan
srvctl status scan_listener
# 启停集群
# 关闭节点
crsctl stop cluster -all
# 启动集群
crsctl start cluster -all
# 检查集群健康
cluvfy comp healthcheck
cluvfy stage -post crsinst
# RAC 数据库命令
# 查看数据库状态
srvctl status database -d orcl
# 启停数据库
srvctl stop database -d orcl -o immediate
srvctl start database -d orcl
# 启停实例
srvctl stop instance -d orcl -i orcl1
srvctl start instance -d orcl -i orcl1
# 启停服务
srvctl start service -d orcl -s myservice
srvctl stop service -d orcl -s myservice
16.3 RAC 负载均衡与故障转移
16.3.1 客户端连接负载均衡
-- TNS 连接串配置
ORCL_RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.example.com)
(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 20)(DELAY = 15))
)
)
16.3.2 服务器端负载均衡
-- 配置服务级别负载均衡
BEGIN
DBMS_SERVICE.MODIFY_SERVICE(
service_name => 'orcl_app',
goal => DBMS_SERVICE.GOAL_THROUGHPUT,
distribution => 'RATIO'
);
END;
/
-- 创建应用服务
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'oltp_service',
network_name => 'oltp_service.example.com',
goal => DBMS_SERVICE.GOAL_THROUGHPUT,
DTPP => 1
);
END;
/
-- 查看连接分布
SELECT
inst_id,
COUNT(*) AS connections
FROM gv$session
WHERE type = 'USER'
GROUP BY inst_id
ORDER BY inst_id;
16.3.3 TAF (Transparent Application Failover)
-- 配置 TAF
BEGIN
DBMS_SERVICE.MODIFY_SERVICE(
service_name => 'orcl_app',
failover_method => 'BASIC',
failover_type => 'SELECT',
failover_retries => 30,
failover_delay => 5
);
END;
/
-- 查看 TAF 配置
SELECT
service_id,
name,
failover_method,
failover_type,
failover_retries,
failover_delay
FROM dba_services
WHERE name = 'orcl_app';
-- 验证 TAF
SELECT
machine,
failover_type,
failover_method,
failover_count
FROM v$session
WHERE username = 'HR';
16.4 Data Guard 进阶
16.4.1 保护模式详解
| 模式 | 传输方式 | 确认方式 | RPO | 性能影响 |
|---|---|---|---|---|
| 最大保护 | LGWR SYNC | 至少一个备库确认 | 0 | 高 |
| 最大可用 | LGWR SYNC | 正常同最大保护,失败降为异步 | 0或少量 | 中高 |
| 最大性能 | LGWR ASYNC 或 ARCH | 不等待备库 | 少量 | 低 |
-- 查看当前保护模式
SELECT protection_mode, protection_level FROM v$database;
-- 切换保护模式
-- 最大性能 → 最大可用
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
-- 最大可用 → 最大保护
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
-- 最大可用 → 最大性能
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
16.4.2 实时查询备库
-- Active DataGuard 配置
-- 备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
-- 在主库查询备库延迟
SELECT
ARCH.DEST_ID,
ARCH.DEST_NAME,
ARCH.TYPE,
ARCH.DATABASE_MODE,
ARCH.RECOVERY_MODE,
ARCH.PROTECTION_MODE,
ARCH.ARCHIVED_SCN,
ARCH.APPLIED_SCN,
ARCH.APPLIED Lawson,
ARCH.LAST_APPLIED_SCN,
ARCH.LAST_APPLIED Lawson,
ARCH.LAG_TIME
FROM V$ARCHIVE_DEST_STATUS ARCH
WHERE ARCH.DEST_ROLE = 'PHYSICAL STANDBY ROLE';
16.4.3 快照备库
-- 将物理备库转换为快照备库
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
-- 快照备库可以读写操作
-- 用于测试、开发、数据挖掘
-- 测试完成后转换回物理备库
-- 1. 关闭并启动到 MOUNT
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 2. 转换回物理备库
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
-- 3. 启动备库恢复
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
16.5 快速故障转移 (FSFO)
16.5.1 FSFO 配置
-- 1. 确保配置了 Data Guard Broker
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH;
-- 2. 创建 Broker 配置
DGMGRL> CREATE CONFIGURATION 'orcl_dg' AS PRIMARY DATABASE IS 'orcl' CONNECT IDENTIFIER IS 'orcl';
DGMGRL> ADD DATABASE 'orcl_dg' AS CONNECT IDENTIFIER IS 'orcl_dg' MAINTAINED AS PHYSICAL;
-- 3. 启用配置
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> ENABLE DATABASE 'orcl';
DGMGRL> ENABLE DATABASE 'orcl_dg';
-- 4. 配置 FSFO
DGMGRL> EDIT DATABASE 'orcl' SET PROPERTY FastStartFailoverTarget='orcl_dg';
DGMGRL> EDIT DATABASE 'orcl_dg' SET PROPERTY FastStartFailoverTarget='orcl';
DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverThreshold=30;
DGMGRL> EDIT CONFIGURATION SET PROPERTY FastStartFailoverPmyShutdown=TRUE;
-- 5. 启用 Observer
DGMGRL> ENABLE FAST_START FAILOVER;
16.5.2 FSFO 常用命令
# 启动 DGMGRL
dgmgrl /
# 查看状态
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE VERBOSE orcl;
DGMGRL> SHOW DATABASE VERBOSE orcl_dg;
# 启动 Observer(在独立主机)
dgmgrl sys/password@orcl "START OBSERVER"
# 手动故障转移
DGMGRL> CONNECT sys/password@orcl;
DGMGRL> FAILOVER TO orcl_dg;
# 重置配置(故障转移后)
DGMGRL> CONNECT sys/password@orcl_dg;
DGMGRL> REINSTATE DATABASE orcl;
16.6 高可用架构设计
16.6.1 常见架构模式
┌─────────────────────────────────────────────────────────────────┐
│ 常见高可用架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 架构1:RAC + 单 DG (同城灾备) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 机房A 机房B │ │
│ │ ┌────────────┐ ┌────────────┐ │ │
│ │ │ RAC Node1 │ │ Physical │ │ │
│ │ │ RAC Node2 │ ──DG──> │ Standby │ │ │
│ │ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 架构2:RAC + ADG (读写分离) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 写操作:RAC 主库 │ │
│ │ 读操作:ADG 备库 (实时同步,只读) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 架构3:两地三中心 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 主机房 备机房 异地灾备 │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │ │ RAC │───DG───│ RAC │──DG──│ Standby│ │ │
│ │ │(双节点)│ │(单节点)│ │ │ │ │
│ │ └──────┘ └──────┘ └──────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
16.6.2 选型建议
| 场景 | 推荐方案 | RPO | RTO |
|---|---|---|---|
| 核心银行系统 | RAC + DG (最大保护) | 0 | 分钟级 |
| 一般业务系统 | RAC + DG (最大可用) | 秒级 | 分钟级 |
| 报表查询 | RAC + ADG | 0 | - |
| 允许少量丢失 | 单实例 + DG | 秒级 | 分钟级 |
| 跨地域灾备 | 长距离 DG | 分钟级 | 小时级 |
16.6.3 容量规划
-- 监控 DG 状态
SELECT
dest_name,
status,
error,
gap_status
FROM v$archive_dest
WHERE destination IS NOT NULL;
-- 监控备库延迟
SELECT
APPLIED Lawson,
LAST_APPLIED Lawson,
LAG_TIME
FROM V$ARCHIVE_DEST_STATUS
WHERE dest_role = 'PHYSICAL STANDBY ROLE';
-- 监控归档空间
SELECT
thread#,
sequence#,
blocks * block_size / 1024 / 1024 AS size_mb,
first_time,
next_time
FROM v$archived_log
WHERE applied = 'YES'
ORDER BY first_time DESC;
-- RAC 连接监控
SELECT
inst_id,
COUNT(*) AS session_count,
SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) AS active_count
FROM gv$session
WHERE type = 'USER'
GROUP BY inst_id;
16.7 监控与告警
16.7.1 重要监控指标
-- 1. Data Guard 状态
SELECT
db_unique_name,
database_role,
protection_mode,
protection_level,
open_mode,
flashback_on
FROM v$database;
-- 2. 归档传输延迟
SELECT
dest_id,
destination,
archiver,
transmitted_kb,
received_kb,
applied_kb,
ROUND((applied_kb/transmitted_kb)*100, 2) AS apply_rate
FROM v$archive_dest a
JOIN v$database d ON a.dest_id = 2;
-- 3. RAC 集群健康
SELECT
component,
status,
host_name,
target_version
FROM gv$cluster_interconnects;
-- 4. 服务状态
SELECT
name,
type,
support_cpu,
support_processes,
TO_CHAR(last_updated, 'YYYY-MM-DD HH24:MI:SS') AS last_updated
FROM dba_services
ORDER BY name;
16.7.2 告警阈值建议
| 指标 | 警告阈值 | 严重阈值 |
|---|---|---|
| DG 延迟 | > 30 秒 | > 5 分钟 |
| DG 传输失败 | 任何失败 | 持续失败 |
| RAC 节点状态 | 节点离线 | - |
| 归档空间使用 | > 70% | > 85% |
| 连接数 | > 80% max | > 95% max |
16.8 本章小结
✅ 高可用架构层次:应用层 → 数据库层 → 存储层 → 网络层
✅ Oracle RAC:集群架构,节点级高可用,负载均衡
✅ SCAN + Listener:简化客户端连接
✅ TAF:透明故障转移,保证连接连续性
✅ Data Guard:站点级灾备,数据保护
✅ FSFO:快速故障转移,自动故障检测
✅ 架构选型:根据 RPO/RTO 要求选择合适方案
✅ 监控告警:定期检查高可用组件状态
📖 教程完成
恭喜你完成了 Oracle 权威教程的全部内容!
📚 附录:推荐学习路径
入门 → 进阶 → 精通
↓ ↓ ↓
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13 → 14 → 15 → 16
🔗 相关资源