外观
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/orapworcl3.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)
切换是计划内的角色转换,主备数据库角色互换,无数据丢失。
步骤:
检查主数据库是否可以切换
sqlSELECT switchover_status FROM v$database; -- 预期结果:TO STANDBY 或 SESSIONS ACTIVE如果 switchover_status 为 SESSIONS ACTIVE,需要断开所有会话
sqlALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;关闭主数据库并启动到 mount 状态
sqlSHUTDOWN IMMEDIATE; STARTUP MOUNT;检查备数据库是否可以切换
sqlSELECT switchover_status FROM v$database; -- 预期结果:TO PRIMARY 或 SESSIONS ACTIVE将备数据库转换为主数据库
sqlALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;启动新的主数据库
sqlALTER DATABASE OPEN;启动新的备数据库的 redo 应用
sqlALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
2.2 故障转移(Failover)
故障转移是主数据库故障时,将备数据库转换为主数据库,可能会有少量数据丢失。
步骤:
确认主数据库故障
sql-- 在备数据库上检查主数据库状态 SELECT status, error FROM v$archive_dest WHERE dest_id = 2;停止备数据库的 redo 应用
sqlALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;执行故障转移
sql-- 尽可能应用所有可用的 redo 日志 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; -- 将备数据库转换为主数据库 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;启动新的主数据库
sqlALTER DATABASE OPEN;重新配置 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 故障转移的步骤:
- 确保主备数据库数据同步
- 模拟主数据库故障(如关闭主数据库实例)
- 在备数据库上执行故障转移操作
- 验证新的主数据库可以正常工作
- 重新配置 Data Guard,将原来的主数据库作为新的备数据库
- 测试业务应用可以正常连接到新的主数据库
总结
Oracle Data Guard 是一个强大的高可用性和灾难恢复解决方案,通过 redo 日志传输和应用,实现主备数据库之间的数据同步。Data Guard 支持三种备数据库类型和三种保护模式,可以根据业务需求和性能要求进行选择。Data Guard 可以在主数据库故障时,将备数据库切换为主数据库,确保业务的连续性。
Oracle 19c 和 21c 引入了许多新特性,如自动 Data Guard 配置、增强的 Active Data Guard、多租户支持增强、实时主备同步增强和云原生支持等,进一步提高了 Data Guard 的性能、可靠性和易用性。
在设计、部署和运维 Data Guard 时,需要遵循最佳实践,包括选择合适的保护模式、规划网络和存储架构、定期监控和测试、保持主备数据库的一致性等。通过合理的配置和管理,可以充分发挥 Data Guard 的优势,为业务提供高可用性、高性能的数据库服务。
