
Oracle Data Guard数据守护神的配置艺术前言在上一篇文章中我们深入探讨了Oracle RAC如何通过集群技术解决数据库的高可用性High Availability问题。然而RAC解决的只是单个数据中心内的局部故障。当面对数据中心级别的灾难如火灾、地震、电力中断时仅靠RAC是远远不够的。为此Oracle提供了另一项核心的灾难恢复Disaster Recovery, DR技术——Data Guard。如果说RAC是保护数据库的“金钟罩”那么Data Guard就是守护数据的“铁布衫”。本文将带您全面理解Data Guard的工作原理并通过详细的步骤演示如何配置一个物理备用数据库。1. 什么是 Oracle Data Guard1.1 核心定义与价值Oracle Data Guard是Oracle数据库自带的企业级灾难恢复和高可用性解决方案。它的核心机制非常简单而可靠通过持续地传输和应用主数据库Primary Database的重做日志Redo Log来维护一个或多个与主库保持一致的事务一致性备用数据库Standby Database。当主库因计划内或计划外原因不可用时Data Guard可以将任何一台备用数据库快速切换为新的主库接管业务服务从而最大限度地减少停机时间和数据丢失。1.2 Data Guard 的核心工作流Data Guard的整个运作流程可以清晰地分解为以下四个步骤备库StandbyDatabase网络主库PrimaryDatabase1.通过网络发送日志SYNC/ASYNC用户事务生成Redo日志LNS进程Log Network Server归档日志网络传输RFS进程Remote File Server备用重做日志Standby Redo Log应用进程MRP / LSP备库数据文件流程详解日志生成用户在主库上提交事务产生Redo日志。日志传输主库上的日志网络服务器LNS, Log Network Server进程将这些Redo日志通过网络实时发送给备库。日志接收备库上的远程文件服务器RFS, Remote File Server进程接收日志并将其写入本地的备用重做日志Standby Redo Log, SRL中。日志应用备库上的应用进程读取SRL中的日志并进行应用。物理备库使用托管恢复进程MRP, Managed Recovery Process在块级别上应用日志备库数据文件在物理上与主库逐块相同。逻辑备库使用逻辑备用进程LSP, Logical Standby Process将Redo日志解析成SQL语句后执行因此备库可以同时打开为读写模式并能创建额外的索引和物化视图。1.3 保护模式对比Data Guard提供了三种保护模式它们在数据保护和性能之间进行了不同的权衡。| 保护模式 | 传输方式 | 数据丢失风险 | 性能影响 | 描述 || :--- | :--- | :--- | :--- | :--- ||最大保护brMaximum Protection| SYNC | 零数据丢失 | 高 | 主库事务提交前必须等至少一个备库确认日志已写入SRL。如果备库不可用主库会直接停机。 ||最大可用brMaximum Availability| SYNC | 零数据丢失备库正常时 | 中 | 与最大保护类似但如果备库网络断开或不可用主库会自动降级为最大性能模式不会停机。 ||最大性能brMaximum Performance| ASYNC | 可能丢失少量数据 | 低 | 主库事务提交不等待备库任何确认。这是默认模式对主库性能影响最小。 |2. 如何配置物理备用数据库配置Data Guard是一个严谨的系统工程。下面以最常见的物理备库Physical Standby为例在最大可用模式下详述其核心配置步骤。2.1 第一步环境准备与参数配置主库假设我们已有一个运行中的主库SID为ORCL。1. 启用强制日志与归档模式物理备库要求主库必须运行在归档模式ARCHIVELOG下。-- 登录主库 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 启用强制日志确保所有操作都产生redo包括nologging操作 ALTER DATABASE FORCE LOGGING;2. 配置主库初始化参数在主库的初始化参数文件(spfile)中添加或修改以下参数-- 定义Data Guard配置中的数据库唯一名 ALTER SYSTEM SET LOG_ARCHIVE_CONFIGDG_CONFIG(ORCL_PRI,ORCL_STBY) SCOPEBOTH; -- 本地归档目标 ALTER SYSTEM SET LOG_ARCHIVE_DEST_1LOCATION/arch/primary VALID_FOR(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAMEORCL_PRI SCOPEBOTH; -- 远程归档目标即发送到备库 ALTER SYSTEM SET LOG_ARCHIVE_DEST_2SERVICEORCL_STBY LGWR SYNC AFFIRM VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEORCL_STBY SCOPEBOTH; -- 当备库丢失归档文件时从哪里获取 ALTER SYSTEM SET FAL_SERVERORCL_STBY SCOPEBOTH; -- 主备间文件路径映射相同路径则设为一样 ALTER SYSTEM SET DB_FILE_NAME_CONVERT/u01/app/oracle/oradata/ORCL/,/u01/app/oracle/oradata/ORCL/ SCOPESPFILE; ALTER SYSTEM SET LOG_FILE_NAME_CONVERT/u01/app/oracle/oradata/ORCL/,/u01/app/oracle/oradata/ORCL/ SCOPESPFILE; -- 自动管理备库文件当主库添加文件时备库自动添加 ALTER SYSTEM SET STANDBY_FILE_MANAGEMENTAUTO SCOPEBOTH;参数解析DG_CONFIG声明此配置中有两个数据库分别命名为ORCL_PRI和ORCL_STBY。LOG_ARCHIVE_DEST_2SERVICEORCL_STBY使用tnsnames.ora中定义的服务名ORCL_STBY连接备库。LGWR SYNC AFFIRM使用LGWR进程同步传输日志并确认写入备库的SRL。这是实现“最大可用”或“最大保护”模式的关键。VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE)此归档目标仅在当前数据库处于主库角色时对在线日志文件生效。FAL_SERVERFetch Archive Log Server配置备库在出现日志断档时应向哪个库请求获取缺失的归档日志。2.2 第二步创建备库实例与目录结构在备库服务器上进行以下操作安装数据库软件使用与主库完全相同的Oracle数据库版本安装数据库软件仅安装软件不创建数据库。创建目录结构根据上一步DB_FILE_NAME_CONVERT等参数的映射关系在备库服务器上创建与主库完全相同的目录结构例如/u01/app/oracle/oradata/ORCL/和/arch/。配置监听和TNS配置备库的监听器Listener。配置主库和备库上的tnsnames.ora文件确保主库和备库能分别通过ORCL_STBY和ORCL_PRI服务名互相连通。设置环境变量在备库上设置ORACLE_SID环境变量使其与主库一致如ORCL。2.3 第三步复制主库文件并创建备库这一步是从主库备份并还原到备库现在最方便的方法是使用RMAN的DUPLICATE命令。1. 在主库上创建备库控制文件可选-- 在适当位置生成备库控制文件 ALTER DATABASE CREATE STANDBY CONTROLFILE AS /tmp/ORCL_stby.ctl;2. 使用RMAN DUPLICATE自动化创建备库推荐这是最简洁高效的方式它会通过网络直接从活动的主库拷贝所有必需的文件到备库并自动重命名、启动。# 在备库服务器上执行 rman target sys/passwordORCL_PRI auxiliary sys/passwordORCL_STBY RMAN DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE SPFILE PARAMETER_VALUE_CONVERT /u01/app/oracle/oradata/ORCL/,/u01/app/oracle/oradata/ORCL/ SET DB_UNIQUE_NAMEORCL_STBY;这个命令做了以下事情连接到主库target和备库实例auxiliary。从主库的活动内存中拷贝当前数据文件到备库。在备库上创建控制文件。配置好备库的spfile基于主库的spfile和SET子句进行修改。2.4 第四步启动重做应用并验证1. 在备库上启动日志应用-- 以SYSDBA登录备库 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;这条命令在后台启动MRP进程开始应用归档日志。要启用更实时的应用可以使用ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;这会指示MRP进程直接从SRL中应用日志实现“实时应用”进一步减小RPO。2. 验证同步状态在主库和备库上执行以下查询确认Data Guard同步正常。主库端检查归档传输状态SELECT DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE DEST_ID2; -- 理想状态STATUS VALID备库端检查日志应用状态SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY; -- 可以看到MRP进程状态为APPLYING_LOG或WAIT_FOR_LOG如果看到MRP进程的STATUS为APPLYING_LOG且SEQUENCE#在持续递增就代表配置完全成功了。3. Data Guard 运维核心操作3.1 角色转换Data Guard的核心价值在于能够进行角色切换。Switchover计划内切换一种优雅的、无损的角色互换。主库降级为备库备库升级为主库常用于主库硬件维护等场景。sql-- 在主库执行ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;-- 在备库执行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;Failover故障转移当主库发生不可恢复的故障时在备库上强制执行升级操作成为新的主库。Failover可能导致少量数据丢失。sql-- 在备库执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;3.2 常见监控检查-- 在主库查看同步延迟 SELECT * FROM V$DATAGUARD_STATS; -- 在备库查看日志应用延迟 SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAMEtransport lag OR NAMEapply lag;4. Data Guard 配置架构图下面这张图展示了最典型的Data Guard一主一备架构。灾备中心网络传输生产中心发送Redo接收Redo应用程序主库ORCL_PRI读写模式ASM/文件系统Redo日志流SYNC/ASYNC备库ORCL_STBY只读/备用模式ASM/文件系统总结Oracle Data Guard通过其成熟的日志传输和应用机制为数据库提供了无与伦比的灾难恢复能力。它不仅是Oracle高可用架构HA与灾难恢复DR融合的最佳实践更是实现两地三中心、读写分离等高级架构的技术基石。配置Data Guard需要严谨的规划和执行但当您看到主备库日志序列号同步跳动的那一刻相信您会对这份数据库的“铁布衫”功夫充满信心。