Oracle 逻辑备库详解

Oracle 逻辑备库详解

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


1. 概述

逻辑备库是 SQL 应用的备库[1]:

详细见:Oracle Data Guard 架构详解


2. 物理备库 vs 逻辑备库

2.1 物理备库

- 块级复制
- 与主库完全一致
- MRP 进程应用 Redo
- 限制少

2.2 逻辑备库

- SQL 应用
- 逻辑一致
- LSP 进程将 Redo 转 SQL
- 可读写
- 支持不同结构

3. 转换

3.1 物理 → 逻辑

-- 物理备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE START LOGICAL STANDBY APPLY;
-- 自动转换为逻辑备库

3.2 全新创建

-- 主库
EXEC DBMS_LOGSTDBY.BUILD;

-- 备库
ALTER DATABASE RECOVER TO LOGICAL STANDBY new_db_name;
ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

4. SQL Apply

4.1 进程

- READER:读 Redo
- PREPARER:解析
- BUILDER:构建 SQL
- ANALYZER:分析
- APPLIER:执行 SQL

4.2 启动

ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
-- IMMEDIATE:异步

4.3 停止

ALTER DATABASE STOP LOGICAL STANDBY APPLY;

5. 支持数据类型

5.1 支持

- VARCHAR2, NUMBER, DATE
- CLOB, BLOB
- 用户定义类型(部分)

5.2 不支持

- LONG
- LONG RAW
- 用户定义集合(部分)
- 物化视图

5.3 检查

SELECT * FROM dba_logstdby_unsupported;
SELECT * FROM dba_logstdby_unsupported_table;

6. 限制

6.1 DDL

- 大部分 DDL 支持
- 部分对象类型不支持
- 测试

6.2 DML

- INSERT/UPDATE/DELETE
- MERGE
- 部分不支持(如 DBMS_JOB)

6.3 表

- 无主键的表可能有问题
- 推荐 PK 或 supplemental logging

7. Supplemental Logging

7.1 主库

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE INDEX) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

7.2 验证

SELECT supplemental_log_data_min, 
       supplemental_log_data_pk,
       supplemental_log_data_ui,
       supplemental_log_data_all
FROM v$database;

8. 可读写

8.1 优势

- 备库可读写
- 报表
- 测试
- 索引/物化视图

8.2 限制

- 不能修改复制的表
- 可添加非复制对象
- 索引可定制

8.3 实例化视图

-- 逻辑备库
CREATE MATERIALIZED VIEW mv_emp_dept
REFRESH COMPLETE ON DEMAND
AS SELECT ... FROM emp JOIN dept ...;

9. 监控

9.1 状态

SELECT * FROM v$database;
SELECT * FROM v$dataguard_stats;

SELECT * FROM dba_logstdby_progress;
SELECT applied_scn, newest_scn FROM dba_logstdby_progress;

9.2 进程

SELECT * FROM v$logstdby_process;
SELECT sid, serial#, spid, type, status, high_scn 
FROM v$logstdby_process;

9.3 事件

SELECT event, status FROM v$logstdby_events 
WHERE event_time > SYSDATE - 1;

10. DBMS_LOGSTDBY

10.1 配置

EXEC DBMS_LOGSTDBY.APPLY_SET('MAX_SGA', 1024);
EXEC DBMS_LOGSTDBY.APPLY_SET('MAX_SERVERS', 20);
EXEC DBMS_LOGSTDBY.APPLY_SET('PRESERVE_COMMIT_ORDER', TRUE);

10.2 跳过

EXEC DBMS_LOGSTDBY.SKIP('DML', 'SCOTT', 'EMP');
EXEC DBMS_LOGSTDBY.SKIP('DDL', 'SCOTT', '%');
EXEC DBMS_LOGSTDBY.SKIP('SCHEMA_DDL', 'HR', '%');

10.3 实例化

EXEC DBMS_LOGSTDBY.INSTANTIATE_TABLE('SCOTT', 'EMP', 'src_db');

11. 应用场景

11.1 报表

- 备库读写
- 索引优化
- 物化视图

11.2 升级

- 滚动升级
- 主库升级
- 逻辑备库保持

11.3 异构

- 不同版本
- 不同平台
- 不同结构(部分)

12. 与物理备库对比

物理逻辑
应用RedoSQL
一致性块级逻辑
可读写否(Active)
灵活性
性能
限制

13. 常见坑与排错

13.1 ORA-16108

- 数据库已停止
- 重启

13.2 ORA-16224

- 不支持对象
- 检查 dba_logstdby_unsupported

13.3 Lag 大

- 调整 MAX_SERVERS
- 优化

14. 最佳实践

  1. Supplemental Logging:必须
  2. 主键:表设计
  3. 测试:兼容性
  4. 监控:状态
  5. 跳过:避免
  6. 索引定制:报表
  7. 物化视图:报表
  8. 升级:滚动
  9. 文档:限制
  10. 演练:定期

15. 参考资料

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