Oracle 逻辑备库详解
Oracle 逻辑备库详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
逻辑备库是 SQL 应用的备库[1]:
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. 与物理备库对比
| 项 | 物理 | 逻辑 |
|---|---|---|
| 应用 | Redo | SQL |
| 一致性 | 块级 | 逻辑 |
| 可读写 | 否(Active) | 是 |
| 灵活性 | 低 | 高 |
| 性能 | 高 | 中 |
| 限制 | 少 | 多 |
13. 常见坑与排错
13.1 ORA-16108
- 数据库已停止
- 重启
13.2 ORA-16224
- 不支持对象
- 检查 dba_logstdby_unsupported
13.3 Lag 大
- 调整 MAX_SERVERS
- 优化
14. 最佳实践
- Supplemental Logging:必须
- 主键:表设计
- 测试:兼容性
- 监控:状态
- 跳过:避免
- 索引定制:报表
- 物化视图:报表
- 升级:滚动
- 文档:限制
- 演练:定期
15. 参考资料
[1] Oracle Data Guard Concepts and Administration 19c, “Logical Standby” https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/