Skip to content

Oracle Active Data Guard

Oracle Active Data Guard 概述

Oracle Active Data Guard 是 Oracle Data Guard 的高级功能,它允许物理备数据库在应用 redo 日志的同时,提供只读访问功能。Active Data Guard 不仅提供了高可用性和灾难恢复能力,还可以将只读查询转移到备数据库,减轻主数据库的负担,提高系统的整体性能。Active Data Guard 适用于对可用性、数据保护和性能要求较高的关键业务系统。

Active Data Guard 的核心优势

  • 高可用性:当主数据库故障时,可以快速将备数据库切换为主数据库
  • 数据保护:通过实时应用 redo 日志,确保备数据库与主数据库数据一致
  • 只读访问:备数据库在应用 redo 日志的同时,支持只读查询
  • 负载均衡:将只读查询转移到备数据库,减轻主数据库负担
  • 滚动升级:支持在不中断服务的情况下进行数据库升级和维护
  • 自动块修复:自动检测和修复损坏的数据块

Active Data Guard 与普通 Data Guard 的区别

特性普通 Data GuardActive Data Guard
物理备数据库支持支持
实时应用 redo 日志支持支持
备数据库只读访问不支持(需要停止 redo 应用)支持(同时应用 redo 日志)
自动块修复不支持支持
备数据库上的备份支持支持
备数据库上的统计信息收集不支持支持
备数据库上的索引创建不支持支持

Active Data Guard 架构

1. 基本架构

Active Data Guard 架构基于标准的 Data Guard 架构,包括:

  • 主数据库:生产数据库,处理所有的读写操作
  • Active Data Guard 备数据库:物理备数据库,实时应用主数据库的 redo 日志,同时提供只读访问
  • Redo 传输服务:负责将主数据库的 redo 日志传输到备数据库
  • Redo 应用服务:负责在备数据库上实时应用接收到的 redo 日志
  • 只读访问服务:允许客户端连接到备数据库进行只读查询

2. 关键组件

2.1 实时应用进程(MRP)

Managed Recovery Process (MRP) 负责在备数据库上实时应用 redo 日志。在 Active Data Guard 模式下,MRP 以只读模式运行,允许备数据库同时处理只读查询。

2.2 自动块修复

Active Data Guard 支持自动块修复功能,可以:

  • 检测损坏的数据块
  • 从主数据库或其他备数据库自动获取完好的数据块
  • 修复损坏的数据块,无需手动干预

2.3 备数据库上的只读访问

Active Data Guard 备数据库支持多种只读访问方式:

  • 直接连接到备数据库进行只读查询
  • 使用 Oracle Services 实现透明的负载均衡和故障转移
  • 支持 Oracle Real Application Testing 等高级功能

Active Data Guard 配置

1. 配置前提条件

  • 主数据库和备数据库都必须是 Oracle Enterprise Edition
  • 主数据库必须处于归档模式
  • 主数据库必须启用强制日志记录
  • 备数据库必须配置为物理备数据库
  • 需要购买 Active Data Guard 许可证

2. 配置步骤

2.1 主数据库配置

  1. 确保主数据库处于归档模式并启用强制日志记录

    sql
    SELECT log_mode, force_logging FROM v$database;
    -- 预期结果:ARCHIVELOG 和 YES
  2. 配置主数据库的初始化参数

    sql
    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 LGWR SYNC 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;

2.2 备数据库配置

  1. 确保备数据库已配置为物理备数据库

  2. 启动备数据库到 mount 状态

    sql
    STARTUP MOUNT;
  3. 启用 Active Data Guard 模式

    sql
    ALTER DATABASE OPEN READ ONLY;
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
  4. 验证 Active Data Guard 配置

    sql
    SELECT database_role, open_mode FROM v$database;
    -- 预期结果:PHYSICAL STANDBY 和 READ ONLY WITH APPLY
    
    SELECT process, status FROM v$managed_standby WHERE process = 'MRP0';
    -- 预期结果:MRP0 和 APPLYING_LOG

3. 配置客户端连接

3.1 配置 tnsnames.ora

bash
# 主数据库连接字符串
ORCL_PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = primary_server)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_primary)
    )
  )

# Active Data Guard 备数据库连接字符串
ORCL_STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = standby_server)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_standby)
    )
  )

# 负载均衡服务(可选)
ORCL_RO =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary_server)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby_server)(PORT = 1521))
      (LOAD_BALANCE = YES)
      (FAILOVER = ON)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl_ro)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

3.2 配置服务(可选)

sql
-- 在主数据库上创建只读服务
EXEC DBMS_SERVICE.CREATE_SERVICE(
  service_name => 'orcl_ro',
  network_name => 'orcl_ro',
  failover_method => 'BASIC',
  failover_type => 'SELECT',
  failover_retries => 180,
  failover_delay => 5
);

-- 启动只读服务
EXEC DBMS_SERVICE.START_SERVICE('orcl_ro');

-- 在备数据库上注册只读服务
ALTER SYSTEM SET service_names = 'orcl_standby, orcl_ro' SCOPE=BOTH;

Active Data Guard 管理

1. 监控 Active Data Guard 状态

1.1 检查备数据库状态

sql
-- 检查数据库角色和打开模式
SELECT database_role, open_mode FROM v$database;

-- 检查 MRP 进程状态
SELECT process, status, thread#, sequence#, block# FROM v$managed_standby WHERE process = 'MRP0';

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

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

-- 检查自动块修复状态
SELECT * FROM v$dataguard_stats WHERE name LIKE '%block%';

2. 管理只读访问

2.1 连接到 Active Data Guard 备数据库

bash
-- 使用 SQL*Plus 连接
$ sqlplus username/password@orcl_standby

-- 使用服务名连接(负载均衡)
$ sqlplus username/password@orcl_ro

2.2 限制备数据库上的资源使用

sql
-- 在备数据库上设置资源限制
ALTER SYSTEM SET resource_manager_plan = 'DEFAULT_PLAN' SCOPE=BOTH;

-- 创建自定义资源计划,限制备数据库上的资源使用
BEGIN
  DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.CREATE_PLAN(
    plan => 'STANDBY_PLAN',
    comment => 'Resource plan for Active Data Guard standby'
  );
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
    consumer_group => 'STANDBY_READ',
    comment => 'Consumer group for standby read-only sessions'
  );
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'STANDBY_PLAN',
    group_or_subplan => 'STANDBY_READ',
    comment => 'Limit CPU for standby read-only sessions',
    cpu_p1 => 30
  );
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
    plan => 'STANDBY_PLAN',
    group_or_subplan => 'OTHER_GROUPS',
    comment => 'Default directive',
    cpu_p1 => 70
  );
  DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/

-- 启用资源计划
ALTER SYSTEM SET resource_manager_plan = 'STANDBY_PLAN' SCOPE=BOTH;

3. 自动块修复管理

3.1 启用自动块修复

自动块修复默认启用,无需额外配置。可以通过以下方式验证:

sql
SELECT name, value FROM v$parameter WHERE name = 'db_block_checking';
-- 预期结果:db_block_checking 和 MEDIUM 或 FULL

3.2 监控自动块修复

sql
-- 查看自动块修复统计信息
SELECT * FROM v$dataguard_stats WHERE name IN ('physical standby redo apply lag', 'transport lag');

-- 查看损坏块修复记录
SELECT * FROM v$database_block_corruption;

-- 查看自动块修复历史
SELECT * FROM v$bgprocess WHERE name = 'RBAL';

4. 备数据库维护

4.1 在备数据库上收集统计信息

sql
-- 在备数据库上收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(
  ownname => 'SCHEMA_NAME',
  tabname => 'TABLE_NAME',
  estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
  method_opt => 'FOR ALL COLUMNS SIZE AUTO'
);

-- 在备数据库上收集索引统计信息
EXEC DBMS_STATS.GATHER_INDEX_STATS(
  ownname => 'SCHEMA_NAME',
  indname => 'INDEX_NAME',
  estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE
);

4.2 在备数据库上创建索引

sql
-- 在备数据库上创建索引
CREATE INDEX idx_name ON schema.table (column1, column2) TABLESPACE index_ts;

Oracle 19c 和 21c Active Data Guard 新特性

Oracle 19c Active Data Guard 新特性

1. 实时主备同步增强

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

2. 增强的自动块修复

  • 支持跨多个备数据库的自动块修复
  • 提高了自动块修复的成功率和效率
  • 增强了自动块修复的监控和诊断功能

3. 多租户支持增强

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

Oracle 21c Active Data Guard 新特性

1. Active Data Guard DML 重定向

  • 支持将备数据库上的 DML 操作重定向到主数据库
  • 对应用程序透明,无需修改应用代码
  • 提高了应用程序的可用性和灵活性

2. 实时备数据库维护

  • 支持在备数据库上执行更多的维护操作,如分区维护、索引重建等
  • 无需停止 redo 应用,减少维护窗口
  • 提高了系统的可用性

3. 云原生支持

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

Active Data Guard 最佳实践

1. 设计阶段最佳实践

  • 选择合适的硬件:备数据库使用与主数据库相同或相似的硬件配置
  • 规划网络架构:确保主备数据库之间有足够的网络带宽和低延迟
  • 设计存储架构:主备数据库使用独立的存储系统,避免单点故障
  • 考虑地理分布:将备数据库部署在不同的地理位置,实现灾难恢复
  • 规划只读工作负载:评估只读查询的数量和复杂度,合理规划备数据库的资源

2. 部署阶段最佳实践

  • 使用相同的 Oracle 版本:主备数据库使用相同的 Oracle 版本和补丁级别
  • 配置实时应用:启用实时 redo 应用,减少主备数据库之间的数据延迟
  • 配置自动块修复:确保自动块修复功能已启用
  • 配置监控:设置适当的监控和告警,及时发现和处理问题
  • 文档化配置:记录所有配置和参数设置

3. 运维阶段最佳实践

  • 定期监控:监控主备数据库的状态、redo 应用延迟、只读查询性能等
  • 定期测试:每季度或半年执行一次切换测试,确保 Active Data Guard 配置正常
  • 维护备数据库:定期在备数据库上收集统计信息、创建索引、执行备份等
  • 保持主备数据库的一致性:定期检查主备数据库的对象和数据一致性
  • 及时应用补丁:主备数据库同时应用补丁,确保版本一致

4. 性能优化最佳实践

  • 优化只读查询:确保备数据库上的只读查询使用合适的索引和执行计划
  • 限制备数据库资源使用:使用资源管理器限制备数据库上的资源使用,避免影响 redo 应用
  • 优化网络:确保主备数据库之间的网络带宽足够,延迟低
  • 使用适当的连接池:在应用程序中使用连接池,减少连接建立的开销
  • 考虑使用结果缓存:在备数据库上启用结果缓存,提高重复查询的性能

常见问题(FAQ)

Q1: Active Data Guard 与普通 Data Guard 的主要区别是什么?

A1: Active Data Guard 与普通 Data Guard 的主要区别在于:

  • Active Data Guard 允许备数据库在实时应用 redo 日志的同时提供只读访问
  • Active Data Guard 支持自动块修复功能
  • Active Data Guard 允许在备数据库上执行更多的维护操作,如统计信息收集、索引创建等
  • Active Data Guard 需要额外的许可证

Q2: 如何监控 Active Data Guard 的性能?

A2: 可以从以下几个方面监控 Active Data Guard 的性能:

  • 主备数据库之间的 redo 应用延迟
  • 备数据库上的只读查询性能
  • 主备数据库之间的网络带宽使用情况
  • 备数据库的资源使用情况,如 CPU、内存、I/O 等
  • 自动块修复的统计信息

Q3: 如何提高 Active Data Guard 的性能?

A3: 提高 Active Data Guard 性能的方法包括:

  • 优化主备数据库之间的网络,提高带宽,降低延迟
  • 使用高性能存储,提高 I/O 性能
  • 启用实时应用,减少数据延迟
  • 优化备数据库上的只读查询
  • 使用资源管理器限制备数据库上的资源使用

Q4: 可以在 Active Data Guard 备数据库上执行哪些操作?

A4: 可以在 Active Data Guard 备数据库上执行以下操作:

  • 只读查询
  • 备份操作
  • 统计信息收集
  • 索引创建和重建
  • 视图创建
  • 存储过程和函数的编译
  • 数据库导出操作

Q5: 如何切换 Active Data Guard 备数据库为主数据库?

A5: 切换 Active Data Guard 备数据库为主数据库的步骤与标准 Data Guard 切换相同:

  1. 检查主数据库是否可以切换
  2. 将主数据库转换为备数据库
  3. 将 Active Data Guard 备数据库转换为主数据库
  4. 启动新的主数据库
  5. 启动新的备数据库的 redo 应用

Q6: Active Data Guard 支持哪些类型的备数据库?

A6: Active Data Guard 仅支持物理备数据库,不支持逻辑备数据库或快照备数据库。物理备数据库是与主数据库完全一致的物理副本,使用 Media Recovery 应用 redo 日志。

总结

Oracle Active Data Guard 是一个强大的高可用性和灾难恢复解决方案,它允许物理备数据库在实时应用 redo 日志的同时提供只读访问。Active Data Guard 不仅提供了高可用性和数据保护,还可以将只读查询转移到备数据库,减轻主数据库的负担,提高系统的整体性能。

Active Data Guard 支持自动块修复、备数据库上的备份和维护操作等高级功能。Oracle 19c 和 21c 引入了许多新特性,如实时主备同步增强、增强的自动块修复、多租户支持增强、DML 重定向和云原生支持等,进一步提高了 Active Data Guard 的性能、可靠性和易用性。

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