Skip to content

Oracle Data Guard 配置

Oracle Data Guard 配置概述

Oracle Data Guard 是 Oracle 数据库的高可用性和灾难恢复解决方案,通过将主数据库的 redo 日志传输到一个或多个备数据库,并在备数据库上应用这些 redo 日志,实现主备数据库之间的数据同步。Data Guard 可以在主数据库故障时,将备数据库切换为主数据库,确保业务的连续性。Data Guard 适用于对可用性和数据保护要求较高的关键业务系统。

Data Guard 的核心优势

  • 高可用性:当主数据库故障时,可以快速将备数据库切换为主数据库
  • 数据保护:通过 redo 日志传输和应用,确保备数据库与主数据库数据一致
  • 灾难恢复:支持跨地域部署,实现异地灾备
  • 负载均衡:可以将只读查询转移到备数据库,减轻主数据库负担
  • 滚动升级:支持在不中断服务的情况下进行数据库升级和维护

Data Guard 的基本概念

  • 主数据库(Primary Database):生产数据库,处理所有的读写操作
  • 备数据库(Standby Database):主数据库的副本,接收并应用主数据库的 redo 日志
  • Redo 传输服务:负责将主数据库的 redo 日志传输到备数据库
  • Redo 应用服务:负责在备数据库上应用接收到的 redo 日志
  • 保护模式:定义 Data Guard 配置的数据保护级别
  • 角色转换:主备数据库之间的角色切换,包括切换(Switchover)和故障转移(Failover)

Data Guard 架构

1. 备数据库类型

Oracle Data Guard 支持三种类型的备数据库:

1.1 物理备数据库(Physical Standby)

  • 与主数据库完全一致的物理副本
  • 使用 Media Recovery 应用 redo 日志
  • 支持实时应用 redo 日志(Real-Time Apply)
  • 可以转换为快照备用数据库(Snapshot Standby)
  • 支持只读访问(Active Data Guard 功能)

1.2 逻辑备数据库(Logical Standby)

  • 与主数据库逻辑一致的副本
  • 使用 SQL Apply 应用 redo 日志
  • 支持同时进行读写操作
  • 可以针对不同的 schema 或表进行单独的恢复
  • 支持异构平台(不同的操作系统或硬件)

1.3 快照备数据库(Snapshot Standby)

  • 基于物理备数据库创建的可读写副本
  • 使用 Flashback Database 技术支持回滚到原始状态
  • 适合用于测试和开发环境
  • 可以随时转换回物理备数据库

2. 保护模式

Data Guard 支持三种保护模式,提供不同级别的数据保护和性能权衡:

2.1 最大保护模式(Maximum Protection)

  • 提供最高级别的数据保护
  • 确保所有 redo 日志在写入主数据库本地 redo 日志文件之前,必须先写入至少一个备数据库的 standby redo log 文件
  • 主数据库会等待备数据库确认接收 redo 日志后才继续
  • 如果所有备数据库都不可用,主数据库会关闭,防止数据丢失

2.2 最高可用性模式(Maximum Availability)

  • 在不影响主数据库可用性的前提下,提供最高级别的数据保护
  • 正常情况下,主数据库会等待备数据库确认接收 redo 日志后才继续
  • 如果所有备数据库都不可用,主数据库会自动切换到最大性能模式,继续运行
  • 当备数据库恢复可用时,会自动切换回最高可用性模式

2.3 最大性能模式(Maximum Performance)

  • 提供最高级别的性能
  • 主数据库将 redo 日志写入本地 redo 日志文件后,立即继续执行,不等待备数据库确认
  • redo 日志异步传输到备数据库
  • 可能会导致少量数据丢失,取决于网络延迟和备数据库的处理能力

3. Data Guard 配置组件

3.1 日志传输服务

  • LGWR 同步传输:适合最大保护模式和最高可用性模式
  • LGWR 异步传输:适合最大性能模式
  • ARCH 传输:使用归档进程传输 redo 日志,适合网络带宽有限的情况

3.2 Redo 应用服务

  • 实时应用(Real-Time Apply):在 redo 日志写入 standby redo log 文件后立即应用
  • 归档应用(Archive Apply):在 redo 日志归档后应用

3.3 角色转换服务

  • 切换(Switchover):计划内的角色转换,主备数据库角色互换,无数据丢失
  • 故障转移(Failover):主数据库故障时,将备数据库转换为主数据库,可能会有少量数据丢失

Data Guard 配置步骤

1. 预配置准备

1.1 主数据库配置

  • 确保主数据库处于归档模式
  • 启用强制日志记录
  • 配置闪回数据库(可选,但推荐)
  • 创建 standby redo log 文件
  • 配置初始化参数
sql
-- 检查归档模式
SELECT log_mode FROM v$database;

-- 启用归档模式
ALTER DATABASE ARCHIVELOG;

-- 启用强制日志记录
ALTER DATABASE FORCE LOGGING;

-- 检查闪回数据库状态
SELECT flashback_on FROM v$database;

-- 启用闪回数据库
ALTER DATABASE FLASHBACK ON;

-- 创建 standby redo log 文件(大小与主 redo 日志相同)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/oradata/standby_redo04.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oradata/standby_redo05.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oradata/standby_redo06.log') SIZE 2G;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oradata/standby_redo07.log') SIZE 2G;

1.2 备数据库准备

  • 安装与主数据库相同版本的 Oracle 软件
  • 配置相同的 Oracle 环境变量
  • 确保主备数据库之间的网络连接正常
  • 配置主备数据库之间的 SSH 免密登录(用于 RMAN 备份恢复)

2. 主数据库初始化参数配置

sql
-- 配置主数据库初始化参数
ALTER SYSTEM SET db_name = 'orcl' SCOPE=SPFILE;
ALTER SYSTEM SET db_unique_name = 'orcl_primary' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_config = 'dg_config=(orcl_primary,orcl_standby)' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_primary' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2 = 'SERVICE=orcl_standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_standby' 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 = 'orcl_standby' SCOPE=BOTH;
ALTER SYSTEM SET fal_client = 'orcl_primary' SCOPE=BOTH;
ALTER SYSTEM SET standby_file_management = 'AUTO' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_format = '%t_%s_%r.arc' SCOPE=SPFILE;

3. 备数据库配置

3.1 创建备数据库初始化参数文件

sql
-- 从主数据库创建备数据库的 pfile
CREATE PFILE='/tmp/initorcl_standby.ora' FROM SPFILE;

-- 修改备数据库的 pfile 参数
-- 将 db_unique_name 改为 orcl_standby
-- 添加 standby_role 相关参数

3.2 创建备数据库密码文件

bash
-- 从主数据库复制密码文件到备数据库
$ scp $ORACLE_HOME/dbs/orapworcl oracle@standby_server:$ORACLE_HOME/dbs/orapworcl

3.3 使用 RMAN 复制主数据库到备数据库

bash
-- 在备数据库上启动实例到 nomount 状态
$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='/tmp/initorcl_standby.ora';

-- 在主数据库上使用 RMAN 复制数据库到备数据库
$ rman target sys/password@orcl_primary auxiliary sys/password@orcl_standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
      DORECOVER
      SPFILE
      SET db_unique_name='orcl_standby'
      SET log_archive_config='dg_config=(orcl_primary,orcl_standby)'
      SET log_archive_dest_1='LOCATION=/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_standby'
      SET log_archive_dest_2='SERVICE=orcl_primary ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_primary'
      SET log_archive_dest_state_1='ENABLE'
      SET log_archive_dest_state_2='ENABLE'
      SET fal_server='orcl_primary'
      SET fal_client='orcl_standby'
      SET standby_file_management='AUTO'
      NOFILENAMECHECK;

3.4 启动备数据库的 redo 应用

sql
-- 启动备数据库到 mount 状态
ALTER DATABASE MOUNT STANDBY DATABASE;

-- 启动实时 redo 应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

-- 或启动归档 redo 应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

4. 配置监听和 tnsnames.ora

4.1 主备数据库的 listener.ora 配置

bash
# 主数据库和备数据库的 listener.ora 配置类似
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary_server)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl_primary_DGB)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

4.2 主备数据库的 tnsnames.ora 配置

bash
# 主数据库和备数据库的 tnsnames.ora 配置
ORCL_PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary_server)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_primary)
    )
  )

ORCL_STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby_server)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_standby)
    )
  )

Data Guard 管理

1. 监控 Data Guard 状态

1.1 检查主备数据库状态

sql
-- 检查主数据库状态
SELECT database_role, protection_mode, protection_level, switchover_status FROM v$database;

-- 检查备数据库状态
SELECT database_role, protection_mode, protection_level, switchover_status FROM v$database;

-- 检查备数据库的 redo 应用状态
SELECT process, status, thread#, sequence#, block# FROM v$managed_standby;

-- 检查 redo 日志传输状态
SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id IN (1, 2);

-- 检查主备数据库的日志序列号差异
-- 主数据库
SELECT MAX(sequence#) FROM v$archived_log;

-- 备数据库
SELECT MAX(sequence#) FROM v$archived_log WHERE applied = 'YES';

2. 角色转换操作

2.1 切换(Switchover)

切换是计划内的角色转换,主备数据库角色互换,无数据丢失。

步骤

  1. 检查主数据库是否可以切换

    sql
    SELECT switchover_status FROM v$database;
    -- 预期结果:TO STANDBY 或 SESSIONS ACTIVE
  2. 如果 switchover_status 为 SESSIONS ACTIVE,需要断开所有会话

    sql
    ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;
  3. 关闭主数据库并启动到 mount 状态

    sql
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
  4. 检查备数据库是否可以切换

    sql
    SELECT switchover_status FROM v$database;
    -- 预期结果:TO PRIMARY 或 SESSIONS ACTIVE
  5. 将备数据库转换为主数据库

    sql
    ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
  6. 启动新的主数据库

    sql
    ALTER DATABASE OPEN;
  7. 启动新的备数据库的 redo 应用

    sql
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

2.2 故障转移(Failover)

故障转移是主数据库故障时,将备数据库转换为主数据库,可能会有少量数据丢失。

步骤

  1. 确认主数据库故障

    sql
    -- 在备数据库上检查主数据库状态
    SELECT status, error FROM v$archive_dest WHERE dest_id = 2;
  2. 停止备数据库的 redo 应用

    sql
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
  3. 执行故障转移

    sql
    -- 尽可能应用所有可用的 redo 日志
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
    
    -- 将备数据库转换为主数据库
    ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
  4. 启动新的主数据库

    sql
    ALTER DATABASE OPEN;
  5. 重新配置 Data Guard,将原来的主数据库作为新的备数据库

3. 日常管理任务

3.1 监控 redo 日志传输和应用

  • 定期检查主备数据库的日志序列号差异
  • 监控备数据库的 redo 应用状态
  • 检查归档日志的传输状态

3.2 备份备数据库

  • 可以在备数据库上执行备份,减轻主数据库负担
  • 支持增量备份和全量备份
  • 备份可以用于恢复主数据库或备数据库

3.3 维护备数据库

  • 定期更新备数据库的统计信息
  • 定期检查备数据库的性能
  • 定期测试角色转换,确保 Data Guard 配置正常

Oracle 19c 和 21c Data Guard 新特性

Oracle 19c Data Guard 新特性

1. 自动 Data Guard 配置

  • 简化了 Data Guard 的配置过程
  • 支持使用 Enterprise Manager 或命令行自动配置 Data Guard
  • 减少了手动配置的错误

2. 增强的 Active Data Guard

  • 支持在备数据库上执行 DML 操作(通过 Snapshot Standby)
  • 增强了备数据库的只读性能
  • 支持在备数据库上创建索引和物化视图

3. 多租户支持增强

  • 支持 PDB 级别的 Data Guard 配置
  • 增强了 PDB 的迁移和管理功能
  • 支持跨 CDB 的 PDB 复制

Oracle 21c Data Guard 新特性

1. 实时主备同步增强

  • 优化了 redo 日志传输和应用的性能
  • 支持更低的网络延迟
  • 提高了主备数据库之间的数据同步速度

2. 智能故障转移

  • 增强了故障检测和诊断功能
  • 支持自动故障转移
  • 减少了故障转移的恢复时间

3. 云原生支持

  • 增强了与 Oracle Cloud 的集成
  • 支持跨云 Data Guard 配置
  • 支持在 Kubernetes 环境中部署 Data Guard

Data Guard 最佳实践

1. 设计阶段最佳实践

  • 选择合适的保护模式:根据业务需求和性能要求选择保护模式
  • 规划网络架构:确保主备数据库之间有足够的网络带宽和低延迟
  • 设计存储架构:主备数据库使用独立的存储系统,避免单点故障
  • 考虑地理分布:将备数据库部署在不同的地理位置,实现灾难恢复
  • 规划角色转换策略:制定详细的切换和故障转移流程

2. 部署阶段最佳实践

  • 使用相同的 Oracle 版本:主备数据库使用相同的 Oracle 版本和补丁级别
  • 配置闪回数据库:方便快速恢复到之前的状态
  • 创建 standby redo log 文件:建议 standby redo log 文件的数量比主 redo 日志组多 1 个
  • 启用实时 redo 应用:减少主备数据库之间的数据延迟
  • 配置适当的归档日志保留策略:确保备数据库有足够的归档日志进行恢复

3. 运维阶段最佳实践

  • 定期监控 Data Guard 状态:使用 Enterprise Manager 或命令行工具监控 Data Guard 配置
  • 定期测试角色转换:每季度或半年执行一次切换测试,确保 Data Guard 配置正常
  • 定期备份备数据库:减少主数据库的备份负担,提高备份的可靠性
  • 保持主备数据库的一致性:定期检查主备数据库的对象和数据一致性
  • 及时应用补丁:主备数据库同时应用补丁,确保版本一致

常见问题(FAQ)

Q1: Data Guard 与 RAC 有什么区别?

A1: Data Guard 和 RAC 是 Oracle 提供的两种不同的高可用性解决方案:

  • RAC 提供单个数据库的高可用性和负载均衡,所有节点共享同一存储
  • Data Guard 提供数据库的冗余和灾难恢复,主库和备库使用独立的存储
  • 两者可以结合使用,提供更高级别的可用性和灾难恢复能力

Q2: 如何选择 Data Guard 的保护模式?

A2: 选择 Data Guard 的保护模式需要平衡数据保护和性能要求:

  • 最大保护模式:适合对数据保护要求极高的关键业务系统,如金融交易系统
  • 最高可用性模式:适合对可用性和数据保护要求都较高的系统
  • 最大性能模式:适合对性能要求较高,对数据丢失容忍度较高的系统

Q3: 如何监控 Data Guard 的状态?

A3: 可以使用以下工具监控 Data Guard 的状态:

  • Oracle Enterprise Manager (OEM):提供图形化的监控界面
  • SQL 查询:查询 v$database、v$managed_standby、v$archive_dest 等视图
  • Data Guard Broker:提供命令行和图形化的管理界面

Q4: 如何处理 Data Guard 中的 gaps?

A4: 当主备数据库之间的 redo 日志出现 gaps 时,可以使用以下方法处理:

  • 使用 Data Guard Broker 的自动 gap 检测和修复功能
  • 手动复制缺失的归档日志到备数据库,并在备数据库上注册这些归档日志
  • 使用 RMAN 的 RECOVER STANDBY DATABASE FROM SERVICE 命令从主数据库获取缺失的 redo 日志

Q5: 如何在备数据库上执行备份?

A5: 可以在备数据库上执行备份,减轻主数据库负担:

  • 备数据库必须处于 mount 或 open read-only 状态
  • 可以使用 RMAN 执行全量备份、增量备份或归档日志备份
  • 备份可以用于恢复主数据库或备数据库

Q6: 如何测试 Data Guard 的故障转移?

A6: 测试 Data Guard 故障转移的步骤:

  1. 确保主备数据库数据同步
  2. 模拟主数据库故障(如关闭主数据库实例)
  3. 在备数据库上执行故障转移操作
  4. 验证新的主数据库可以正常工作
  5. 重新配置 Data Guard,将原来的主数据库作为新的备数据库
  6. 测试业务应用可以正常连接到新的主数据库

总结

Oracle Data Guard 是一个强大的高可用性和灾难恢复解决方案,通过 redo 日志传输和应用,实现主备数据库之间的数据同步。Data Guard 支持三种备数据库类型和三种保护模式,可以根据业务需求和性能要求进行选择。Data Guard 可以在主数据库故障时,将备数据库切换为主数据库,确保业务的连续性。

Oracle 19c 和 21c 引入了许多新特性,如自动 Data Guard 配置、增强的 Active Data Guard、多租户支持增强、实时主备同步增强和云原生支持等,进一步提高了 Data Guard 的性能、可靠性和易用性。

在设计、部署和运维 Data Guard 时,需要遵循最佳实践,包括选择合适的保护模式、规划网络和存储架构、定期监控和测试、保持主备数据库的一致性等。通过合理的配置和管理,可以充分发挥 Data Guard 的优势,为业务提供高可用性、高性能的数据库服务。