Oracle Snapshot Standby 详解

Oracle Snapshot Standby 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Snapshot Standby 是可读写的备库快照[1]:

详细见:Oracle Data Guard 架构详解


2. 特性

2.1 可读写

- 备库可读写
- 测试/开发
- 临时

2.2 Flashback 恢复

- 保证还原点
- Flashback 恢复
- 重新同步

2.3 Redo 保持

- 主库 Redo 继续
- 接收但不应用
- 恢复后应用

3. 转换

3.1 物理 -> Snapshot

-- 备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
SHUTDOWN IMMEDIATE;
STARTUP;

3.2 Broker

DGMGRL> EDIT DATABASE stby SET STATE='READ-WRITE';

4. 使用

4.1 测试

- 应用测试
- 数据修改
- 验证

4.2 报表

- 复杂报表
- 临时索引
- 性能

4.3 开发

- 开发环境
- 数据真实
- 隔离

5. 还原

5.1 Snapshot -> 物理

-- Snapshot Standby
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

5.2 Broker

DGMGRL> EDIT DATABASE stby SET STATE='APPLY-ON';

5.3 重新同步

- Flashback 到还原点
- 应用累积 Redo
- 同步

6. 保证还原点

6.1 创建

-- Snapshot 转换时自动创建
SELECT name, guarantee_flashback_database, scn
FROM v$restore_point;

6.2 Flashback 区域

- FRA 空间
- Flashback 日志
- 监控

6.3 删除

- 转换回物理时自动
- 或手动

7. 监控

7.1 状态

SELECT database_role, open_mode, switchover_status
FROM v$database;
-- SNAPSHOT STANDBY / READ WRITE

7.2 还原点

SELECT name, scn, time, guarantee_flashback_database
FROM v$restore_point;

7.3 Redo

-- 主库
SELECT max(sequence#) FROM v$archived_log;
-- 备库
SELECT max(sequence#) FROM v$archived_log;
-- 差距

8. 限制

8.1 灾备保护

- Snapshot 期间无灾备
- 主库故障无法 failover
- 评估

8.2 时间

- 时间限制
- Redo 累积
- 空间

8.3 Flashback

- FRA 空间
- 监控
- 调整

9. 应用场景

9.1 测试

- 应用升级测试
- 真实数据
- 隔离

9.2 报表

- 临时报表
- 索引
- 性能

9.3 开发

- 开发环境
- 数据刷新
- 灵活

10. 常见问题

10.1 ORA-38754

- Flashback 未启用
- 检查

10.2 FRA 满

- Flashback 日志
- 清理
- 增大

10.3 同步慢

- Redo 累积
- 重新应用
- 时间

11. 最佳实践

  1. 测试:使用
  2. 时间:限制
  3. FRA:监控
  4. 还原点:保证
  5. Redo:监控累积
  6. 转换:低峰
  7. 监控:状态
  8. 文档:流程
  9. 演练:定期
  10. 评估:灾备影响

12. 参考资料

[1] Oracle Data Guard 19c, “Snapshot Standby” https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/