Oracle Snapshot Standby 详解
Oracle Snapshot Standby 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Snapshot Standby 是可读写的备库快照[1]:
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. 最佳实践
- 测试:使用
- 时间:限制
- FRA:监控
- 还原点:保证
- Redo:监控累积
- 转换:低峰
- 监控:状态
- 文档:流程
- 演练:定期
- 评估:灾备影响
12. 参考资料
[1] Oracle Data Guard 19c, “Snapshot Standby” https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/