一、开篇:为什么 Data Guard 是生产环境的标配?
某银行核心交易系统在 A 城市数据中心运行。为保障业务连续性,在 B 城市部署了 Data Guard 物理备库。某天 A 城市因自然灾害导致数据中心断电,主库无法访问。DBA 在 B 城市执行了 Failover 操作,备库在 3 分钟内切换为主库,业务恢复运行,数据丢失为零。
Data Guard 是 Oracle 原生提供的高可用和灾备解决方案,通过将主库的归档日志实时传输到备库并自动应用,实现主备数据库的实时同步。
本篇文章从架构原理、环境搭建、运维管理到故障切换,全面覆盖 Data Guard 的核心知识点和实战操作。
二、Data Guard 架构全景图
架构关键解读:
- 主库:生产数据库,接收所有用户事务。
- 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 = 'SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db'; -- 配置本地归档目标 ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl'; -- 启用归档目标 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' SCOPE=SPFILE;2. 创建备库
步骤一:创建备库参数文件
-- 从主库创建 pfile CREATE PFILE='/tmp/init_standby.ora' FROM SPFILE; -- 修改备库 pfile 中的参数 -- *.db_unique_name='standby_db' -- *.fal_server='orcl' -- *.log_archive_dest_2='SERVICE=orcl ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'步骤二:使用 RMAN DUPLICATE 创建备库
# 在备库服务器上启动实例到 NOMOUNT 状态 sqlplus / as sysdba STARTUP NOMOUNT PFILE='/tmp/init_standby.ora'; # 在主库使用 RMAN DUPLICATE 创建备库 rman target sys/password@orcl auxiliary sys/password@standby_db RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET db_unique_name='standby_db' COMMENT 'Data Guard standby' SET fal_server='orcl' 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(缺失)
检测 GAP:
SELECT * 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/password@orcl 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 演练?欢迎评论区分享你的经验。