ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Oracle Data Guard 容灾实战:从搭建到切换,一篇讲透

Oracle Data Guard 容灾实战:从搭建到切换,一篇讲透 Oracle Data Guard 容灾实战从搭建到切换一篇讲透Oracle Data Guard 是 Oracle 企业级容灾方案的核心通过维护一个或多个备库来保护主库数据安全。本文从架构原理到搭建实战从 Switchover 到 Failover从监控到故障处理一篇文章让你彻底掌握 Data Guard。一句话总结Oracle Data Guard 通过Redo 日志传输 应用实现主备数据库同步提供最大保护、最大可用、最大性能三种保护模式支持物理备库、逻辑备库、快照备库是 Oracle 数据库异地容灾的首选方案。一、Data Guard 架构与核心概念1.1 Data Guard 能解决什么问题场景解决方案主库宕机服务器故障备库接管快速切换机房灾难火灾/断电异地备库恢复读写分离报表查询Active Data Guard 备库只读备份卸载在备库执行 RMAN 备份升级测试快照备库测试回退无影响1.2 Data Guard 架构图┌─────────────────────────────────────────────────────────────┐ │ Primary Database (主库) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ LGWR → Online Redo Log → (传输) → Standby Redo Log │ │ │ │ (主库) │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ │ LNS / ARCn │ │ (Redo 传输) │ └─────────────────────────┬───────────────────────────────────┘ │ ┌───────────▼───────────┐ │ 网络传输 (TCP) │ │ (可选加密/压缩) │ └───────────┬───────────┘ │ ┌─────────────────────────▼───────────────────────────────────┐ │ Standby Database (备库) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Standby Redo Log → (应用) → Datafiles │ │ │ │ ↓ │ │ │ │ Archivelog (归档日志) │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘1.3 核心术语术语含义Primary Database主库生产数据库Standby Database备库与主库保持同步Physical Standby物理备库块级复制与主库完全一致Logical Standby逻辑备库通过 SQL 应用备库可有不同结构Snapshot Standby快照备库物理备库临时转为可读写用于测试Active Data Guard (ADG)备库在 Redo Apply 的同时以只读模式打开Redo TransportRedo 日志传输服务Apply Mode备库应用模式Redo Apply / SQL Apply1.4 三种保护模式模式数据安全性性能传输方式RPOMaximum Protection最大保护最高影响最大SYNC AFFIRM0绝对不丢Maximum Availability最大可用高影响较小SYNC正常/ ASYNC异常正常情况下 0Maximum Performance最大性能中影响最小ASYNC可能丢少量数据生产建议金融系统用Maximum Protection或Maximum Availability一般业务用Maximum Performance。二、搭建 Physical Standby2.1 环境准备项目主库备库主机名primary-dbstandby-dbIP192.168.1.101192.168.1.102ORACLE_SIDorclorcl_stbyDB_UNIQUE_NAMEprimarystandby数据库版本19c19c必须相同2.2 主库配置-- 1. 开启归档模式SHUTDOWNIMMEDIATE;STARTUP MOUNT;ALTERDATABASEARCHIVELOG;ALTERDATABASEOPEN;-- 验证ARCHIVE LOG LIST;-- 2. 开启 Force LoggingALTERDATABASEFORCELOGGING;-- 验证SELECTFORCE_LOGGINGFROMV$DATABASE;-- 3. 创建 Standby Redo Log比 Online Redo Log 多一组-- 查看当前 Redo Log 大小和组数SELECTGROUP#, BYTES/1024/1024 AS SIZE_MB FROM V$LOG;-- 添加 Standby Redo Log建议与 Online Redo Log 大小一致多 1-2 组ALTERDATABASEADDSTANDBY LOGFILE THREAD1GROUP4(/u01/oradata/orcl/srl04.log)SIZE200M;ALTERDATABASEADDSTANDBY LOGFILE THREAD1GROUP5(/u01/oradata/orcl/srl05.log)SIZE200M;ALTERDATABASEADDSTANDBY LOGFILE THREAD1GROUP6(/u01/oradata/orcl/srl06.log)SIZE200M;ALTERDATABASEADDSTANDBY LOGFILE THREAD1GROUP7(/u01/oradata/orcl/srl07.log)SIZE200M;-- 验证SELECTGROUP#, THREAD#, BYTES/1024/1024 AS SIZE_MB, STATUS FROM V$STANDBY_LOG;-- 4. 配置 Redo 传输参数ALTERSYSTEMSETLOG_ARCHIVE_CONFIGDG_CONFIG(primary,standby)SCOPEBOTH;-- 本地归档ALTERSYSTEMSETLOG_ARCHIVE_DEST_1LOCATIONUSE_DB_RECOVERY_FILE_DEST VALID_FOR(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAMEprimarySCOPEBOTH;-- 传输到备库ALTERSYSTEMSETLOG_ARCHIVE_DEST_2SERVICEstandby LGWR ASYNC VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandbySCOPEBOTH;-- 5. 配置 FAL自动缺口解决ALTERSYSTEMSETFAL_SERVERstandbySCOPEBOTH;ALTERSYSTEMSETFAL_CLIENTprimarySCOPEBOTH;-- 6. 配置文件路径转换主备目录不同时ALTERSYSTEMSETSTANDBY_FILE_MANAGEMENTAUTOSCOPEBOTH;ALTERSYSTEMSETDB_FILE_NAME_CONVERT/u01/oradata/orcl/,/u01/oradata/orcl_stby/SCOPEBOTH;ALTERSYSTEMSETLOG_FILE_NAME_CONVERT/u01/oradata/orcl/,/u01/oradata/orcl_stby/SCOPEBOTH;2.3 配置 TNS主库 tnsnames.oraPRIMARY (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST primary-db)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME primary) ) ) STANDBY (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST standby-db)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME standby) ) )备库 tnsnames.ora同上拷贝过去即可。2.4 密码文件同步# 主库生成密码文件orapwdfile$ORACLE_HOME/dbs/orapworclpasswordxxxxxentries10# 拷贝到备库文件名改为备库 SIDscp$ORACLE_HOME/dbs/orapworcl standby-db:$ORACLE_HOME/dbs/orapworcl_stby2.5 创建备库RMAN 方法# 在主库执行rman target sys/xxxxxprimary# 1. 备份主库包含备库控制文件RMANBACKUP DATABASE PLUS ARCHIVELOG;RMANBACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT/u01/backup/stby_ctrl_%U;# 2. 将备份传到备库服务器scp-r/u01/backup/* standby-db:/u01/backup/# 在备库执行rman target sys/xxxxxstandby_stby# 3. 恢复备库RMANRESTORE STANDBY CONTROLFILE FROM/u01/backup/stby_ctrl_01;RMANALTER DATABASE MOUNT;RMANRESTORE DATABASE;RMANRECOVER DATABASE NOREDO;-- 没有归档日志需要应用或者用 DUPLICATE 从活动数据库直接复制更简单# 在备库服务器执行rman target sys/xxxxxprimary auxiliary sys/xxxxxstandby_stby RMANDUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;2.6 启动 Redo Apply-- 在备库启动 Redo ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;-- 验证同步状态SELECTPROCESS,STATUS,THREAD#, SEQUENCE#, BLOCK#, BLOCKSFROMV$MANAGED_STANDBY;-- 验证传输延迟SELECTNAME,VALUE,DATUM_TIMEFROMV$DATAGUARD_STATSWHERENAMEIN(transport lag,apply lag);2.7 开启 Active Data Guard可选-- 备库以只读模式打开同时应用 RedoALTERDATABASERECOVER MANAGED STANDBYDATABASECANCEL;ALTERDATABASEOPENREADONLY;ALTERDATABASERECOVER MANAGED STANDBYDATABASEUSINGCURRENTLOGFILE DISCONNECT;-- 验证SELECTOPEN_MODE,DATABASE_ROLEFROMV$DATABASE;-- 应显示: READ ONLY WITH APPLY | PHYSICAL STANDBY三、Data Guard Broker简化运维3.1 启用 Broker-- 主库和备库都要执行ALTERSYSTEMSETDG_BROKER_STARTTRUESCOPEBOTH;3.2 配置 Broker# 连接 Brokerdgmgrl sys/xxxxxprimary DGMGRLCREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS primary CONNECT IDENTIFIER IS primary;DGMGRLADD DATABASE standby AS CONNECT IDENTIFIER IS standby MAINTAINED AS PHYSICAL;DGMGRLENABLE CONFIGURATION;DGMGRLSHOW CONFIGURATION;-- 查看详细信息 DGMGRLSHOW DATABASE VERBOSE primary;DGMGRLSHOW DATABASE VERBOSE standby;3.3 用 Broker 切换DGMGRLSWITCHOVER TO standby;-- Switchover计划切换 DGMGRLFAILOVER TO standby;-- Failover故障切换 DGMGRLREINSTATE DATABASE primary;-- 恢复原主库为新备库四、Switchover 与 Failover4.1 Switchover计划性切换-- Switchover主备角色互换无数据丢失-- 适用场景维护、升级、测试-- 1. 在主库执行ALTERDATABASECOMMITTOSWITCHOVERTOSTANDBY;-- 2. 在备库执行ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARY;ALTERDATABASEOPEN;-- 3. 在新备库原主库启动 Redo ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;4.2 Failover故障切换-- Failover备库提升为主库主库已不可用-- 适用场景主库崩溃、机房灾难-- 1. 在备库执行ALTERDATABASERECOVER MANAGED STANDBYDATABASEFINISH;ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARY;ALTERDATABASEOPEN;-- 2. 如果原主库恢复后需要重建为新备库-- 用 RMAN 从新主库重建备库RMANDUPLICATETARGETDATABASEFORSTANDBYFROMACTIVEDATABASENOFILENAMECHECK;4.3 切换对比操作前提条件数据丢失后续操作Switchover主库和备库都正常无原主库自动变备库Failover主库不可用可能丢失未传输的 Redo需要重建原主库为新备库五、监控与告警5.1 关键监控指标-- 1. 检查 Redo 传输延迟SELECTNAME,VALUE,DATUM_TIMEFROMV$DATAGUARD_STATSWHERENAMEIN(transport lag,apply lag);-- transport lag传输延迟主库到备库-- apply lag应用延迟备库应用进度-- 2. 检查归档传输状态SELECTDEST_ID,STATUS,ERRORFROMV$ARCHIVE_DEST_STATUSWHEREDEST_IDIN(1,2);-- STATUS 应该是 VALIDERROR 应该为空-- 3. 查看 Redo Apply 进度SELECTPROCESS,STATUS,THREAD#, SEQUENCE#, BLOCK#, BLOCKSFROMV$MANAGED_STANDBY;-- 4. 检查 GAP归档缺口SELECT*FROMV$ARCHIVE_GAP;-- 如果有 GAP说明备库缺失归档日志需要手动传输-- 5. 查看 Redo 日志序列号主备对比-- 主库SELECTTHREAD#, MAX(SEQUENCE#) FROM V$ARCHIVED_LOG GROUP BY THREAD#;-- 备库SELECTTHREAD#, MAX(SEQUENCE#) FROM V$ARCHIVED_LOG GROUP BY THREAD#;-- 差值就是 GAP5.2 告警脚本示例#!/bin/bash# dg_monitor.sh - Data Guard 监控脚本exportORACLE_HOME/u01/app/oracle/product/19c/dbhome_1exportORACLE_SIDorclexportPATH$ORACLE_HOME/bin:$PATH# 检查传输延迟TRANSPORT_LAG$(sqlplus-ssys/xxxxxprimaryEOF SET HEADING OFF FEEDBACK OFF SELECT VALUE FROM V\$DATAGUARD_STATSWHERE NAMEtransport lag; EXIT; EOF)# 检查应用延迟APPLY_LAG$(sqlplus-ssys/xxxxxstandbyEOF SET HEADING OFF FEEDBACK OFF SELECT VALUE FROM V\$DATAGUARD_STATSWHERE NAMEapply lag; EXIT; EOF)# 检查 GAPGAP_COUNT$(sqlplus-ssys/xxxxxstandbyEOF SET HEADING OFF FEEDBACK OFF SELECT COUNT(*) FROM V\$ARCHIVE_GAP; EXIT; EOF)# 告警阈值秒LAG_THRESHOLD300# 5 分钟# 解析延迟格式00 00:05:30parse_lag(){locallag$1echo$lag|awk-F[ :]{print $2*3600 $3*60 $4}}transport_seconds$(parse_lag$TRANSPORT_LAG)apply_seconds$(parse_lag$APPLY_LAG)if[$transport_seconds-gt$LAG_THRESHOLD]||[$GAP_COUNT-gt0];thenecho[ALERT] Data Guard Lag! Transport:${transport_seconds}s, Apply:${apply_seconds}s, GAP:${GAP_COUNT}|\mail-sOracle Data Guard Alertdbacompany.comfiecho[$(date)] DG Monitor: Transport${transport_seconds}s, Apply${apply_seconds}s, GAP${GAP_COUNT}5.3 Broker 监控DGMGRLSHOW CONFIGURATION;-- 输出示例 -- Configuration - dg_config -- Protection Mode: MaxPerformance -- Members: -- primary - Primary database -- standby - Physical standby database -- -- Fast-Start Failover: DISABLED -- -- Configuration Status: -- SUCCESS DGMGRLSHOW DATABASE standby;-- 检查各成员状态 DGMGRLSHOW DATABASE VERBOSE standby;六、故障处理6.1 Redo 传输失败-- 现象备库接收不到 Redo-- 1. 检查错误SELECTDEST_ID,STATUS,ERRORFROMV$ARCHIVE_DEST_STATUSWHEREDEST_ID2;-- 2. 常见原因和解决方案-- 原因 1网络不通-- 解决检查防火墙和 TNS 连通性-- $ tnsping standby-- 原因 2密码文件不同步-- 解决重新生成并拷贝密码文件-- $ orapwd file$ORACLE_HOME/dbs/orapworcl passwordxxxxx entries10-- $ scp orapworcl standby-db:$ORACLE_HOME/dbs/orapworcl_stby-- 原因 3备库未启动-- 解决启动备库-- $ sqlplus sys/xxxxxstandby_stby-- SQL STARTUP MOUNT;-- 原因 4LOG_ARCHIVE_DEST_2 配置错误-- 解决检查参数-- SQL SHOW PARAMETER LOG_ARCHIVE_DEST_2;6.2 GAP归档缺口-- 现象备库缺失部分归档日志-- 1. 检查 GAPSELECT*FROMV$ARCHIVE_GAP;-- 2. 查看缺失的归档日志SELECTTHREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;-- 3. 在主库找到缺失的归档日志SELECTNAMEFROMV$ARCHIVED_LOGWHERETHREAD# 1 AND SEQUENCE# BETWEEN 100 AND 105;-- 4. 手动传输到备库scp/u01/fast_recovery_area/orcl/archivelog/2026_08_14/o1_mf_1_100_xxx.arc standby-db:/u01/arch/-- 5. 在备库注册ALTERDATABASEREGISTER LOGFILE/u01/arch/o1_mf_1_100_xxx.arc;-- 6. 重新启动 Redo ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;6.3 Redo Apply 失败-- 现象备库 Redo Apply 停止-- 1. 检查错误SELECTMESSAGEFROMV$DATAGUARD_STATUSWHERESEVERITYErrorORDERBYTIMESTAMPDESC;-- 2. 常见原因-- - 备库数据文件丢失 → RESTORE DATAFILE-- - 备库空间不足 → 扩展磁盘-- - 数据文件路径错误 → 修改 STANDBY_FILE_MANAGEMENT-- 3. 重新启动 ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;6.4 备库数据文件丢失-- 1. 在备库还原数据文件ALTERDATABASERECOVER MANAGED STANDBYDATABASECANCEL;RESTOREDATAFILE5;RECOVER DATAFILE5;-- 2. 重新启动 ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;七、Fast-Start Failover自动故障切换7.1 配置 FSFO# 需要 Oracle Observer观察进程# 1. 启用 FSFODGMGRLENABLE FAST_START FAILOVER;# 2. 启动 Observer在第三方机器运行DGMGRLSTART OBSERVER;-- Observer 会持续监控主库如果主库不可用自动触发 Failover7.2 FSFO 工作原理Observer第三方机器 │ ├── 监控主库心跳检测 │ │ │ ├── 主库正常 → 不干预 │ │ │ └── 主库超时 → 触发自动 Failover │ │ │ └── 备库提升为主库 │ └── 通知应用切换连接八、快照备库Snapshot Standby-- 快照备库物理备库临时转为可读写用于测试-- 1. 转换为快照备库ALTERDATABASECONVERTTOSNAPSHOTSTANDBY;ALTERDATABASEOPEN;-- 此时备库可读写用于升级测试、数据验证等-- 2. 测试完成后转回物理备库-- 注意所有测试数据都会被丢弃SHUTDOWNIMMEDIATE;STARTUP MOUNT;ALTERDATABASECONVERTTOPHYSICAL STANDBY;-- 3. 重新启动 Redo ApplyALTERDATABASERECOVER MANAGED STANDBYDATABASEDISCONNECTFROMSESSION;九、Logical Standby逻辑备库-- 逻辑备库通过 SQL Apply备库可有不同结构-- 1. 在主库创建 LogMiner 字典ALTERDATABASEADDSUPPLEMENTAL LOGDATA(PRIMARYKEY,UNIQUEINDEX)COLUMNS;EXECUTELOGSTDBY.BUILD;-- 2. 在备库转换为逻辑备库ALTERDATABASERECOVERTOLOGICAL standby_logical;ALTERDATABASEOPEN;-- 3. 启动 SQL ApplyALTERDATABASESTARTLOGICAL STANDBYAPPLYIMMEDIATE;-- 4. 在逻辑备库创建额外对象主库没有的CREATETABLEextra_data(id NUMBER,dataVARCHAR2(100));-- 5. 跳过某些表的同步EXECUTEDBMS_LOGSTDBY.SKIP(SCHEMA_DDL,HR,TEMP_TABLES);EXECUTEDBMS_LOGSTDBY.SKIP_STMT(DML,HR,TEMP_TABLES);十、Data Guard 最佳实践10.1 架构设计场景推荐方案单机容灾Primary Physical Standby读写分离Primary Physical Standby ADG高可用 容灾RAC Data Guard自动故障切换Data Guard FSFO异构同步Data Guard GoldenGate10.2 运维要点监控告警设置 transport lag、apply lag 阈值告警定期演练每季度做一次 Switchover 演练密码同步主库密码修改后同步到备库归档管理及时清理备库已应用的归档日志网络稳定Redo 传输对网络质量敏感建议使用专线版本一致主备库 Oracle 版本必须一致补丁同步主库打补丁后备库也要同步10.3 性能优化-- 1. 使用异步传输MAXIMUM PERFORMANCEALTERSYSTEMSETLOG_ARCHIVE_DEST_2SERVICEstandby LGWR ASYNC VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandby;-- 2. 开启 Redo 传输压缩ALTERSYSTEMSETLOG_ARCHIVE_DEST_2SERVICEstandby LGWR ASYNC COMPRESSIONENABLE VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandby;-- 3. 增加并行传输19cALTERSYSTEMSETLOG_ARCHIVE_DEST_2SERVICEstandby LGWR SYNC PARALLEL64 VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandby;十一、总结备库类型一致性可用性适用场景Physical Standby块级一致只读ADG或不可用核心业务容灾Logical Standby逻辑一致可读写部分表异构同步、报表Snapshot Standby物理一致可读写测试升级测试、验证操作数据丢失停机时间后续操作Switchover无分钟级自动变备库Failover可能丢失分钟级需要重建FSFO无秒级自动切换系列文章ORA-01017 故障排查Oracle 高可用教程Oracle RMAN 备份恢复教程总结Data Guard 不是搭完就完了没有演练过的灾备等于没有灾备。每季度做一次 Switchover 演练每次 5 分钟换来的是主库宕机时的 5 分钟快速恢复。这笔账怎么算都划算。
返回列表