DataGuard 高可用架构

Oracle DataGuard 物理/逻辑备库配置、切换、故障转移完整指南

最后更新: 2026-04-15
页面目录

第十二章:DataGuard 高可用架构

文档信息
  • 适用版本:Oracle 12c / 19c / 21c
  • 阅读时间:约 60 分钟
  • 前置要求:已开启归档模式

5.1 DataGuard 概述

5.1.1 架构原理

┌─────────────────────────────────────────────────────────────────────┐
│                    Oracle DataGuard 架构                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌──────────────────┐                    ┌──────────────────┐     │
│   │   主库 (Primary)  │◄────── 归档日志 ───►│   备库 (Standby)  │     │
│   │                  │    (ARCH/LGWR)     │                  │     │
│   │  ┌────────────┐  │                    │  ┌────────────┐  │     │
│   │  │ 生产业务   │  │                    │  │ 日志应用    │  │     │
│   │  │ 读写操作   │  │                    │  │ (MRP/LSP)   │  │     │
│   │  └────────────┘  │                    │  └────────────┘  │     │
│   │                  │                    │                  │     │
│   │  归档模式         │                    │  实时/延迟应用   │     │
│   │  FORCE LOGGING   │                    │  只读打开        │     │
│   └──────────────────┘                    └──────────────────┘     │
│                                                                     │
│   保护模式:                                                        │
│   ├── 最大性能 (Maximum Performance) - 异步传输,零性能影响          │
│   ├── 最大可用 (Maximum Availability) - 同步/异步自动切换            │
│   └── 最大保护 (Maximum Protection) - 强制同步,零数据丢失           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

5.1.2 备库类型对比

特性 物理备库 (Physical) 逻辑备库 (Logical)
复制方式 Redo 日志块级复制 SQL 语句级复制
数据一致性 完全一致的副本 可以部分复制
应用场景 灾备、读写分离 报表查询、数据迁移
转换时间 快速切换 需要停止应用
额外功能 快照备库 可写表支持

5.2 物理备库配置

5.2.1 主库配置

-- 1. 确认主库处于归档模式
SELECT log_mode FROM v$database;
-- 结果应为 ARCHIVELOG

-- 2. 开启强制日志
ALTER DATABASE FORCE LOGGING;

-- 3. 配置主库参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORCL,ORCLDG)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=ORCLDG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCLDG' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
ALTER SYSTEM SET FAL_SERVER=ORCLDG SCOPE=BOTH;
ALTER SYSTEM SET FAL_CLIENT=ORCL SCOPE=BOTH;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/ORCLDG','/u01/app/oracle/oradata/ORCL' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/ORCLDG','/u01/app/oracle/oradata/ORCL' SCOPE=SPFILE;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;

5.2.2 备库创建(RMAN 复制)

# 1. 配置备库监听器和网络服务名
# listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCLDG)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
      (SID_NAME = ORCLDG)
    )
  )

# tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ORCL))
  )

ORCLDG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ORCLDG))
  )
# 2. 使用 RMAN 复制数据库
$ rman target sys/password@ORCL auxiliary sys/password@ORCLDG

RMAN> DUPLICATE TARGET DATABASE
      FOR STANDBY
      FROM ACTIVE DATABASE
      DORECOVER
      SPFILE
        SET DB_UNIQUE_NAME='ORCLDG'
        SET LOG_ARCHIVE_DEST_2='SERVICE=ORCL LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL'
      NOFILENAMECHECK;

5.2.3 启动日志应用

-- 备库启动到 MOUNT 状态
STARTUP MOUNT;

-- 开启实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

-- 或者延迟应用(如延迟 1 小时)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DELAY 60 DISCONNECT;

5.3 切换与故障转移

5.3.1 Switchover(计划内切换)

-- ========== 主库操作 ==========
-- 1. 检查切换状态
SELECT switchover_status FROM v$database;
-- 应为 TO STANDBY

-- 2. 执行切换
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

-- 3. 关闭并重启到 MOUNT
SHUTDOWN ABORT;
STARTUP MOUNT;

-- ========== 原备库操作 ==========
-- 1. 检查状态
SELECT switchover_status FROM v$database;
-- 应为 TO PRIMARY

-- 2. 切换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

-- 3. 打开新主库
ALTER DATABASE OPEN;

-- 4. 新备库开启日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

5.3.2 Failover(故障转移)

注意事项

Failover 会丢失未传输的日志,仅在主库完全不可用的情况下使用

-- 1. 停止日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

-- 2. 检查日志应用情况
SELECT THREAD#, SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

-- 3. 执行故障转移
ALTER DATABASE FAILOVER TO ORCLDG;

-- 4. 打开为新主库
ALTER DATABASE OPEN;

-- 5. 重建原主库(修复后)
-- 使用 RMAN DUPLICATE 或 Flashback Database

5.4 监控与维护

5.4.1 同步状态检查

-- 查看日志传输延迟
SELECT 
    name,
    value,
    unit,
    time_computed
FROM v$dataguard_stats
WHERE name IN ('transport lag', 'apply lag', 'apply finish time');

-- 查看归档日志应用情况
SELECT 
    dest_name,
    status,
    error,
    gap_status
FROM v$archive_dest_status
WHERE dest_id <= 2;

-- 查看日志序列号同步
SELECT 
    max(sequence#) as primary_seq,
    (SELECT max(sequence#) FROM v$archived_log WHERE applied='YES') as standby_seq,
    max(sequence#) - (SELECT max(sequence#) FROM v$archived_log WHERE applied='YES') as gap
FROM v$archived_log
WHERE dest_id=1 AND archived='YES';

5.4.2 Active DataGuard 只读查询

-- 备库以只读模式打开(需要 Active DataGuard 许可)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

-- 或者使用快照备库进行读写测试
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
-- 执行测试操作...
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

5.5 本章小结

核心要点
  1. 三种保护模式:最大性能、最大可用、最大保护
  2. 物理备库:块级复制,适合灾备,切换快速
  3. Switchover:计划内切换,零数据丢失
  4. Failover:故障转移,可能丢失数据
  5. 监控重点:传输延迟、应用延迟、日志 Gap

下一步:学习 第十三章:归档日志管理