Oracle Standby 数据库详解

Oracle Standby 数据库详解

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


1. 概述

Standby 数据库提供灾备和高可用[1]:

类型

  • 物理 Standby
  • 逻辑 Standby
  • Snapshot Standby
  • Far Sync

详细见:Oracle Data Guard 架构详解Oracle Data Guard 部署详解


2. 物理 Standby

2.1 特点

- 块级同步
- Redo Apply
- 一致
- 简单

2.2 应用

- MRP(Managed Recovery Process)
- Redo 应用
- 只读(Active Data Guard)

3. 逻辑 Standby

3.1 特点

- SQL 应用
- 逻辑一致
- 可异构
- 可查询

3.2 应用

- LSP(Logical Standby Process)
- SQL 重做
- 表级

3.3 限制

- 部分数据类型不支持
- 部分操作不支持
- DBMS_LOGSTDBY

3.4 配置

-- 主库补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;

-- Standby
ALTER DATABASE START LOGICAL STANDBY APPLY;
ALTER DATABASE STOP LOGICAL STANDBY APPLY;

-- 跳过表
EXEC DBMS_LOGSTDBY.SKIP('SCHEMA_DDL', 'SCOTT', 'EMPLOYEES');

4. Snapshot Standby

4.1 特点

- 读写
- 保留 Redo
- 可恢复
- 测试

4.2 转换

-- 物理 → Snapshot
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;

-- Snapshot → 物理
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

4.3 应用场景

- 测试
- 报表
- 开发

5. Far Sync

5.1 概述

- 远距离
- 中继
- SYNC + ASYNC
- 零数据丢失 + 性能

5.2 架构

Primary ──SYNC──► Far Sync ──ASYNC──► Standby

5.3 配置

-- Far Sync 实例
-- 仅控制文件 + Redo
CREATE PFILE='...' FROM SPFILE;
-- 启动 nomount

6. 保护模式

6.1 Maximum Performance

- ASYNC
- 默认
- 性能优先
- 可能丢失

6.2 Maximum Availability

- SYNC
- 零丢失
- 主库等待
- 网络要求

6.3 Maximum Protection

- SYNC AFFIRM
- 零丢失
- 强制
- 备库不可用则主库停

6.4 切换

-- Maximum Protection
ALTER SYSTEM SET log_archive_dest_2='service=std sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=orcl_std';
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;

7. Redo 传输

7.1 ASYNC

- 异步
- 不等待
- 性能

7.2 SYNC

- 同步
- 等待
- 一致

7.3 AFFIRM

- 确认写盘
- 强一致

7.4 NOAFFIRM

- 不确认
- 性能

8. Redo Apply

8.1 物理备库

-- 启动
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

-- 实时
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

-- 停止
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

8.2 Active Data Guard

-- 只读 + Apply
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

9. Switchover

9.1 Broker

DGMGRL> SWITCHOVER TO orcl_std;

9.2 SQL

-- 主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

-- 备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;

-- 原 Primary 启 MRP
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

详细见:Oracle Data Guard 部署详解


10. Failover

10.1 Broker

DGMGRL> FAILOVER TO orcl_std;

10.2 SQL

-- 停 Apply
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 完成
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

-- 激活
ALTER DATABASE ACTIVATE STANDBY DATABASE;
ALTER DATABASE OPEN;

10.3 Flashback 重建

-- 原 Primary
-- 启用 Flashback(提前)
ALTER DATABASE FLASHBACK ON;

-- Failover 后
-- 原 Primary 重置到 Failover SCN
ALTER DATABASE FLASHBACK TO SCN xxx;
-- 转为 Standby
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;

详细见:Oracle Flashback 技术全集


11. 监控

11.1 进程

SELECT process, status, thread#, sequence# FROM v$managed_standby;

11.2 延迟

SELECT name, value, time_computed, datum_time 
FROM v$dataguard_stats;
-- transport lag
-- apply lag

11.3 Gap

SELECT * FROM v$archive_gap;

11.4 归档

SELECT thread#, sequence#, archived, applied, deleted 
FROM v$archived_log ORDER BY sequence# DESC;

11.5 Broker

DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE orcl_pri;
DGMGRL> SHOW DATABASE orcl_std;

12. 常见坑与排错

12.1 ORA-12154

- tnsnames.ora
- 服务名
- 监听器

12.2 ORA-16191

- 密码文件
- sys 密码同步

12.3 Gap

SELECT * FROM v$archive_gap;
-- 手动注册
ALTER DATABASE REGISTER LOGFILE '/path/to/log';

12.4 ORA-16816

- Broker 状态
- 重新同步
DGMGRL> ENABLE DATABASE orcl_std;

13. 最佳实践

  1. Standby Redo Log:实时
  2. Active Data Guard:只读
  3. Snapshot Standby:测试
  4. Far Sync:远距离
  5. Broker:简化
  6. 保护模式:业务
  7. 监控 lag:及时
  8. Flashback:重建
  9. 测试切换:能力
  10. 文档化:流程

14. 参考资料

[1] Oracle Data Guard Concepts and Administration 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/