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 本章小结
核心要点
- 三种保护模式:最大性能、最大可用、最大保护
- 物理备库:块级复制,适合灾备,切换快速
- Switchover:计划内切换,零数据丢失
- Failover:故障转移,可能丢失数据
- 监控重点:传输延迟、应用延迟、日志 Gap
下一步:学习 第十三章:归档日志管理