高可用方案

最后更新: 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

🔗 相关资源