Skip to content

Oracle Data Guard:数据保护的「金钟罩」

你有没有这种担忧:

机房着火,所有数据全没了。

磁盘故障,业务中断好几小时。

Oracle Data Guard,就是来解决这个问题的。

今天,认识 Oracle 的数据保护方案。


Data Guard 是什么?

Data Guard 是 Oracle 提供的数据高可用和灾备解决方案,通过在主库和备库之间同步数据,实现数据保护和快速故障切换。

Data Guard 架构:

主库(Primary Database)

    │ Redo 传输


备库(Standby Database)1 ──► 备库(Standby Database)2

Data Guard 的价值

价值说明
数据保护实时同步,数据零丢失
高可用主库故障时快速切换
灾难恢复支持异地灾备
性能提升备库分担查询压力

Data Guard 架构

角色类型

角色说明
Primary Database主库,处理正常业务
Physical Standby物理备库,完全同步,数据块级别复制
Logical Standby逻辑备库,SQL 语句级别复制,可用于查询
Snapshot Standby快照备库,可读写,用于测试

保护模式

模式说明数据保护级别
Maximum Availability最大可用(默认)零数据丢失,可能短暂中断
Maximum Protection最大保护零数据丢失,主库不可用
Maximum Performance最大性能(默认)可能丢失少量数据
sql
-- 查看当前保护模式
SELECT protection_mode, protection_level FROM v$database;

-- 修改保护模式
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;

物理 Data Guard 配置

主库配置

sql
-- 1. 启用强制日志
ALTER DATABASE FORCE LOGGING;

-- 2. 配置归档模式
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)';
ALTER SYSTEM SET log_archive_dest_2 = 'SERVICE=standby1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)';

-- 3. 配置 TNS 别名
-- listener.ora 和 tnsnames.ora 中配置主备库连接

-- 4. 备份数据库用于创建备库
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

备库配置

sql
-- 1. 创建备库控制文件
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/standby.ctl';

-- 2. 配置备库参数文件
-- standby_init.ora:
-- db_name=orcl
-- db_unique_name=standby1
-- log_archive_config='dg_config=(orcl,standby1)'

-- 3. 启动备库到mount状态
STARTUP NOMOUNT;
ALTER DATABASE MOUNT STANDBY DATABASE;

-- 4. 启用实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

Redo 传输服务

传输模式

模式说明性能可靠性
ARCH归档传输
LGWR SYNC日志写同步
LGWR ASYNC日志写异步
sql
-- 配置 LGWR 同步传输
ALTER SYSTEM SET log_archive_dest_2 = 
    'SERVICE=standby1 LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)';

-- 配置 LGWR 异步传输
ALTER SYSTEM SET log_archive_dest_2 = 
    'SERVICE=standby1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)';

实时应用

sql
-- 启用实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

-- 停止实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 查看应用状态
SELECT sequence#, applied, registrar, creation_date 
FROM v$archived_log
ORDER BY sequence# DESC;

故障切换(Failover)

计划内切换(Switchover)

sql
-- 主库:转换为备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

-- 备库:转换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

-- 新主库:开启日志应用
ALTER DATABASE OPEN;

计划外切换(Failover)

sql
-- 备库:执行故障切换
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

-- 转换为新主库
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;

故障切换注意事项

  1. 数据丢失:根据保护模式,可能丢失未应用的日志
  2. 重新配置:切换后需要重新配置应用程序连接
  3. 恢复主库:原主库恢复后需要重建为新备库

逻辑 Data Guard

逻辑备库特点

特性说明
数据可用可用于只读查询和报表
数据转换可在备库进行数据转换
角色切换支持 Switchover 和 Failover
限制部分 DDL/DML 不支持

创建逻辑备库

sql
-- 从物理备库转换为逻辑备库
ALTER DATABASE RECOVER TO LOGICAL STANDBY ORCL;

-- 开启 SQL 应用
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

-- 查看应用状态
SELECT * FROM V$LOGSTDBY_PROGRESS;

逻辑备库的查询

sql
-- 查询逻辑备库
SELECT * FROM v$database WHERE NAME = 'STANDBY';

-- 逻辑备库可以执行只读查询
SELECT COUNT(*) FROM sales;

快照备库

快照备库特点

特性说明
可读写暂挂日志应用后可读写
测试环境用于测试和开发
自动恢复转换为快照后自动应用日志

创建快照备库

sql
-- 将物理备库转换为快照备库
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;

-- 使用快照备库进行测试
-- ...

-- 将快照备库转换回物理备库
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

Data Guard 监控

关键视图

sql
-- 查看数据库角色
SELECT database_role, protection_mode, protection_level FROM v$database;

-- 查看日志应用状态
SELECT sequence#, applied, registrar, applied_time
FROM v$archived_log
WHERE applied = 'YES'
ORDER BY sequence# DESC;

-- 查看 GAP(日志缺失)
SELECT * FROM v$archive_gap;

-- 查看传输状态
SELECT dest_id, destination, status, transmit_mode, affirm
FROM v$archive_dest WHERE status != 'INACTIVE';

常见故障排查

sql
-- 检查 FAL 服务器配置
SHOW PARAMETER fal_server;

-- 检查日志归档
SELECT dest_id, status, error FROM v$archive_dest WHERE status = 'ERROR';

-- 重试失败的归档目的地
ALTER SYSTEM SET log_archive_dest_state_2 = ENABLE;

面试高频问题

Q1: 物理备库和逻辑备库的区别?

物理备库在数据块级别完全复制主库,无法用于查询;逻辑备库通过 SQL 语句复制,可以在备库上执行只读查询和部分 DML 操作。

Q2: 三种保护模式的区别?

Maximum Protection 保证零数据丢失,但主库不可用;Maximum Availability 尽量保证零数据丢失,可能短暂中断;Maximum Performance 优先性能,可能丢失少量数据。

Q3: 如何监控 Data Guard 状态?

通过 v$database 查看数据库角色和保护模式,通过 v$archived_log 查看日志应用状态,通过 v$archive_dest 查看归档目的地状态。


总结

Data Guard 是 Oracle 高可用方案的核心:

组件作用
Redo 传输将主库日志传输到备库
应用服务在备库应用日志
保护模式控制数据保护级别
角色切换实现高可用

掌握 Data Guard,是 DBA 的必备技能。


下一步

基于 VitePress 构建