Oracle CDC 怎么做
Oracle 没有 MySQL 那样的通用 binlog 订阅接口,日志型 CDC 依赖 redo 日志与归档日志解析。常见路径有三条:数据库内置的 LogMiner(PL/SQL 包 DBMS_LOGMNR,可自己写解析程序)、商业复制产品 GoldenGate,以及第三方工具的连接器——Debezium 与 Flink CDC 的 Oracle 连接器大多也以 LogMiner 为基础。前置条件是要开启归档日志与补充日志(supplemental logging),并为采集账号授予相应权限,否则 UPDATE 与 DELETE 事件取不到旧值或直接报错。
基本信息
| 日志路径 | redo 与归档日志(归档必须先开启) |
|---|---|
| 解析工具 | LogMiner(内置)、GoldenGate(商业)、第三方连接器 |
| 补充日志 | UPDATE 与 DELETE 取旧值的前提,可按库或按表开启 |
| 权限 | 采集账号需字典访问与 LogMiner 相关权限,按版本核对 |
| 回溯范围 | 由 redo 与归档保留窗口决定 |
典型使用场景
- 把 Oracle 交易库实时同步到数仓或 Kafka 供下游分析
- 异构迁移:Oracle 到分布式数据库或大数据平台的持续复制
- 准实时明细入仓:按表开启补充日志后解析变更事件
- 稽核与审计:从日志解析变更轨迹,核对谁在什么时候改了什么
- 故障回溯:结合归档日志补齐中断期间的变更
补充日志检查与开启
补充日志检查与开启
-- 数据库级补充日志(最小补充日志)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- 表级:记录所有列的补充日志,保证 UPDATE 前后值都可用
ALTER TABLE app.orders ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
-- 确认归档模式与补充日志状态
SELECT log_mode, supplemental_log_data_min FROM v$database;
SELECT log_group_name, table_name FROM dba_log_groups WHERE table_name = 'ORDERS';三条路径对照
| 路径 | 性质 | 特点 | 适用 |
|---|---|---|---|
| LogMiner | 数据库内置 | 需自行开发解析与位点管理 | 可控性强、想自研的团队 |
| GoldenGate | 商业产品 | 功能完善,许可成本高 | 对稳定性要求高的企业 |
| Debezium 连接器 | 开源 | 依赖 LogMiner,配置较复杂 | 已有 Kafka 生态的团队 |
| Flink CDC 连接器 | 开源 | 与 Flink 作业一体,便于加工 | 流批一体加工场景 |
补充日志会明显增大 redo 体积:按表开启并评估存储与日志写入压力,避免为了同步而影响生产库的日志切换频率。
redo 与归档的保留窗口决定可回溯范围:保留窗口短于故障恢复所需时间时,中断稍久就只能做全量重新初始化。
Oracle 版本之间补充日志与权限细节有差异:切换采集账号或升级数据库前,用测试库先验证一遍解析结果,特别是 UPDATE 的旧值是否完整。