[笔记]CDC(Change Data Capture) 数据变化捕获,实现原理 方案
整理了下对CDC的理解,以及基于Oracle的实现方式。备案如下
CDC(Change Data Capture) 数据变化捕获 | |||||
实现方式 | 原理 | 缺点 | 优点 | 典型方案 | |
时间戳/版本号/修改状态列 | 根据更新时间戳列,识别数据变化。 一般是非实时。 | 1) 实时性 2) 不能识别多次更新 3) 不能记录删除操作 4) 要改程序 | |||
快照 | 通过比较源表和快照表来获得数据变化。 | 1) 实时性 2) 不能识别多次更新 3) 需要大量存储空间保存快照 4) 做数据比较的消耗 | |||
触发器 | 创建数据增/删/改的触发器,将变更数据写入临时表。 | 1) 影响数据库性能 2) 引入一些不可控的影响 | SymmetricDS java开源项目 | 1)会根据用户的配置自动安装触发器 2)会定期地再次安装新的触发器和更新原有的触发器(默认情况下,是在每天午夜) 3)数据库触发器记录的数据变化都在DATA表 4)变化的数据被插入到DATA表之后,会被分批交给节点处理 | |
数据库日志 | 绝大多数数据库都会有种日志,记录操作产生的数据变更,用来做多副本同步或者数据恢复。注:得到的是行级更改,如:一条update语句可能修改多行记录。 | 1) 开发难度 a)没统一标准 b)格式不公开 | 1) 实时性 2) 通过数据库自身机制实现 | Oracle MySql Maxwell | GoldenGate是直接解析的日志 Debezium及很多三方方案都是基于LogMiner/Xstreams |
抓取命令 | 通过网络抓包得到发给Oracle数据库的TNS命令包(仅Oracle响应是执行成功的),从中解析得到数据变更操作的语句和参数。 | 1) 存在漏命令包的可能 a)抓包程序故障 2) 开发难度 其他不确定:加密、命令包顺序 | 1) 实时性 2) 不依赖数据库功能 |
基于 Oracle redo log 实现数据变化捕获 | |||
方式 | 介绍 | 说明 | |
Oracle提供 | 解析原生日志 | ||
GoldenGate | |||
LogMiner | 是由一组SQL包和一些动态视图组成,能帮助我们从 redo logs (Online/Offline) 中提取数据。特别是可以分析出所有对于数据库操作的DML和DDL语句。 | Oracle 8i 开始提供的工具 后续可能被阉割或砍掉?Vs. Xstreams & OGG | |
XStreams | Oracle数据库组件和API,能够直接解析出数据库操作的DML和DDL发送给应用程序。 | 需要购买OGG授权 最初可能是要给OGG用的,但最终OGG是直接解析的 redo log | |
三方库/工具 | OpenLogReplicator (c++开源项目) | 是一个转换器,读取 Oracle redo log 并输出成JSON。 | 1) 不支持 Oracle 11.2 之前的版本; 2) 不保证能捕获100%完整的数据库事务操作 a) 如果遇到无法解码的 redo log 会立即停止,但用户可以强制跳过无效的日志记录并继续工作; b) 有许多安全检查来验证 redo log 的完整性; |
Debezium (java开源项目) | 支持多种数据库的数据捕获,但对Oracle 数据库实际是调用 LogMiner or Xstreams 实现的。 | ||
… |
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/debug_fan/article/details/121035162