外观
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 Guard | Active 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 主数据库配置
确保主数据库处于归档模式并启用强制日志记录
sqlSELECT log_mode, force_logging FROM v$database; -- 预期结果:ARCHIVELOG 和 YES配置主数据库的初始化参数
sqlALTER 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 备数据库配置
确保备数据库已配置为物理备数据库
启动备数据库到 mount 状态
sqlSTARTUP MOUNT;启用 Active Data Guard 模式
sqlALTER DATABASE OPEN READ ONLY; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;验证 Active Data Guard 配置
sqlSELECT 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_ro2.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 或 FULL3.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 切换相同:
- 检查主数据库是否可以切换
- 将主数据库转换为备数据库
- 将 Active Data Guard 备数据库转换为主数据库
- 启动新的主数据库
- 启动新的备数据库的 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 的优势,为业务提供高可用性、高性能的数据库服务。
