一、开篇为什么 Data Guard 是生产环境的标配某银行核心交易系统在 A 城市数据中心运行。为保障业务连续性在 B 城市部署了 Data Guard 物理备库。某天 A 城市因自然灾害导致数据中心断电主库无法访问。DBA 在 B 城市执行了 Failover 操作备库在 3 分钟内切换为主库业务恢复运行数据丢失为零。Data Guard 是 Oracle 原生提供的高可用和灾备解决方案通过将主库的归档日志实时传输到备库并自动应用实现主备数据库的实时同步。本篇文章从架构原理、环境搭建、运维管理到故障切换全面覆盖 Data Guard 的核心知识点和实战操作。二、Data Guard 架构全景图备库数据中心-B城市日志传输主库数据中心-A城市LNSn-SYNC同步ARCn-ASYNC异步客户端访问Switchover/Failover应用服务器主库VIP备库VIP主库 Primary DatabaseLGWR进程ARCn归档进程联机重做日志本地归档日志备库Standby Redo Log备库归档日志MRP恢复进程物理备库-只读Data Guard Broker架构关键解读主库生产数据库接收所有用户事务。Standby Redo Log备库上的联机重做日志接收主库实时传输的 REDO。物理备库主库的块级别物理副本通过 REDO APPLY 保持同步。日志传输方式SYNC 同步传输保证零数据丢失ASYNC 异步传输提供最大性能。三、Data Guard 核心概念1. Data Guard 的三种保护模式| 保护模式 | 传输方式 | 数据丢失风险 | 性能影响 | 适用场景 ||----------|----------|-------------|----------|----------||最大保护| SYNC | ✅ 零丢失 | ❌ 最大 | 金融核心系统 ||最高可用| SYNC正常时 | ⚠️ 几乎零丢失 | ⚠️ 中等 | 企业级应用 ||最高性能| ASYNC | ⚠️ 可能有少量丢失 | ✅ 最小 | 报表查询分离 |2. 物理备库与逻辑备库的区别| 对比维度 | 物理备库 | 逻辑备库 ||----------|----------|----------|| 同步方式 | 块级别 REDO APPLY | 行级别 SQL APPLY || 物理结构 | 与主库完全相同 | 可以与主库不同 || 打开模式 | MOUNT 或 READ ONLY | READ WRITE || 额外索引 | 不能创建 | 可以创建 || 同步速度 | ✅ 快 | ⚠️ 慢 |四、Data Guard 搭建实战1. 主库配置步骤一启用强制日志和归档模式-- 启用强制日志 ALTER DATABASE FORCE LOGGING; -- 确认归档模式 ARCHIVE LOG LIST; -- 如果未开启归档模式 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 创建 Standby Redo Log大小与主库联机日志相同 ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 (/u01/oradata/ORCL/std_redo04a.log) SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 (/u01/oradata/ORCL/std_redo05a.log) SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 (/u01/oradata/ORCL/std_redo06a.log) SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 (/u01/oradata/ORCL/std_redo07a.log) SIZE 500M;步骤二配置主库参数-- 配置归档目标传输到备库 ALTER SYSTEM SET log_archive_dest_2 SERVICEstandby_db ASYNC VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandby_db; -- 配置本地归档目标 ALTER SYSTEM SET log_archive_dest_1 LOCATION/u01/archivelog VALID_FOR(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAMEorcl; -- 启用归档目标 ALTER SYSTEM SET log_archive_dest_state_1 ENABLE; ALTER SYSTEM SET log_archive_dest_state_2 ENABLE; -- 设置 Data Guard 相关参数 ALTER SYSTEM SET fal_server standby_db; ALTER SYSTEM SET fal_client orcl; ALTER SYSTEM SET standby_file_management AUTO; ALTER SYSTEM SET db_unique_name orcl SCOPESPFILE;2. 创建备库步骤一创建备库参数文件-- 从主库创建 pfile CREATE PFILE/tmp/init_standby.ora FROM SPFILE; -- 修改备库 pfile 中的参数 -- *.db_unique_namestandby_db -- *.fal_serverorcl -- *.log_archive_dest_2SERVICEorcl ASYNC VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEorcl步骤二使用 RMAN DUPLICATE 创建备库# 在备库服务器上启动实例到 NOMOUNT 状态 sqlplus / as sysdba STARTUP NOMOUNT PFILE/tmp/init_standby.ora; # 在主库使用 RMAN DUPLICATE 创建备库 rman target sys/passwordorcl auxiliary sys/passwordstandby_db RMAN DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET db_unique_namestandby_db COMMENT Data Guard standby SET fal_serverorcl COMMENT FAL server NOFILENAMECHECK;步骤三启动备库日志应用-- 在备库上启动日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; -- 查看备库同步状态 SELECT process, status, sequence# FROM v$managed_standby;3. 验证 Data Guard 同步查看传输延迟SELECT name, value, unit, time_computed FROM v$dataguard_stats WHERE name IN (transport lag, apply lag, apply finish time);在主库切换日志验证传输ALTER SYSTEM SWITCH LOGFILE; -- 在备库查看日志应用情况 SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;五、Data Guard 运维管理1. 实时查询备库Active Data Guard-- 以只读方式打开备库 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ALTER DATABASE OPEN READ ONLY; -- 重新启动日志应用同时保持只读 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;2. 监控同步状态查看归档日志传输状态SELECT dest_id, status, error, log_sequence, applied_scn FROM v$archive_dest_status WHERE dest_id 2;查看日志应用进度SELECT al.thrd Thread, almax Last Seq Received, lhmax Last Seq Applied FROM (SELECT thread# thrd, MAX(sequence#) almax FROM v$archived_log WHERE resetlogs_change# (SELECT MAX(resetlogs_change#) FROM v$archived_log) GROUP BY thread#) al, (SELECT thread# thrd, MAX(sequence#) lhmax FROM v$log_history WHERE resetlogs_change# (SELECT MAX(resetlogs_change#) FROM v$log_history) GROUP BY thread#) lh WHERE al.thrd lh.thrd;3. 处理日志 GAP缺失检测 GAPSELECT * FROM v$archive_gap;自动恢复 GAP-- Data Guard 会自动检测并恢复 GAP -- 如果自动恢复失败可以手动恢复 -- 在主库找到缺失的归档日志 -- 传输到备库并注册 ALTER DATABASE REGISTER LOGFILE /path/to/missing_archive.arc;六、角色切换实战1. Switchover计划切换精确描述Switchover 是计划内的主备角色互换通常用于主库维护如升级、迁移切换过程不丢失数据。操作步骤-- 步骤一在主库上确认可以切换 ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN; -- 步骤二在原备库上切换为主库 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; -- 步骤三在新主库上打开 ALTER DATABASE OPEN; -- 步骤四在新备库原主库上启动日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;2. Failover故障切换精确描述Failover 是主库故障时的紧急切换备库接管为主库可能丢失主库故障时未传输的日志数据。操作步骤-- 步骤一在备库上执行 Failover ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; -- 或者强制 Failover跳过未应用的日志 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH SKIP STANDBY LOGFILE; -- 步骤二将备库切换为主库 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; -- 步骤三打开数据库 ALTER DATABASE OPEN;❌注意Failover 后原主库需要重建才能重新加入 Data Guard 环境。七、使用 Data Guard Broker 简化管理1. 配置 Data Guard Broker-- 在主库和备库上启用 Broker ALTER SYSTEM SET dg_broker_start TRUE; -- 创建 Broker 配置 DGMGRL CONNECT sys/passwordorcl DGMGRL CREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS orcl CONNECT IDENTIFIER IS orcl; DGMGRL ADD DATABASE standby_db AS CONNECT IDENTIFIER IS standby_db MAINTAINED AS PHYSICAL; DGMGRL ENABLE CONFIGURATION;2. 使用 Broker 进行切换-- 查看配置状态 DGMGRL SHOW CONFIGURATION; -- 执行 Switchover DGMGRL SWITCHOVER TO standby_db; -- 执行 Failover DGMGRL FAILOVER TO standby_db;八、总结记住这个异地备份类比就够了【Data Guard 是实时异地备份】物理备库✅ 一台复印机主库每写一页复印机就复印一页。最大保护模式❌ 每写一页都必须等复印机确认复印机坏了就停笔。最高可用模式⚠️ 平时等复印机确认复印机坏了就暂时不等。最高性能模式✅ 只管写复印机后面自己慢慢复印。Switchover有计划地把复印机变成主打印机。Failover❌ 打印机坏了紧急启用复印机作为主打印机。Data Guard 是 Oracle 高可用架构的基石。掌握 Data Guard 的搭建、运维和切换操作是 DBA 迈向高级架构师的必经之路。建议生产环境至少配置最高可用模式核心系统配置最大保护模式。你的生产环境部署了 Data Guard 吗使用的哪种保护模式是否进行过真实的 Failover 演练欢迎评论区分享你的经验。