💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
在增量抽取中,如果数据量很大,就只能抽取变化的源数据,即最后一次抽取以来发生了变化的数据。这种数据抽取模式称为变化数据捕获,简称 **CDC**(change data caputer)。 <br/> CDC 大体分为两种:<mark>侵入式</mark>和<mark>非侵入式</mark>。 侵入式是指 CDC 操作会给源系统带来性能影响。只要 CDC 对源库进行了 SQL 语句操作,就可以认为是侵入式的。常用的 CDC 方法也有以下四种: 1. **基于时间戳的CDC** 时间戳: 要求源数据表里有插入时间和更新时间列, 抽取新增数据时根据插入时间, 抽取修改数据根据更新时间。 ``` select * from t where create_time > last_load_time ``` * 缺点 * 不能识别多次更新的数据, 只能拿到最后一次更新的数据 * 不能记录触发有删除逻辑的记录 2. **基于触发器的CDC** 当执行 `insert, update, delete`这些操作的时候可以使用数据库的触发器来执行一些动作, 比如触发器将变更的数据保存到临时表当中, 然后从临时表抽取数据到ODS层。 * 缺点: * 触发器会影响数据库的性能, 这种方式使用的不多 3. **基于快照的CDC** 如果没有时间戳, 也不允许使用触发器, 就可以使用快招标, 每天将MySQL的表都导入到ODS层一次, 每天存成一张新的表, 这样的话, 我可以追溯到任何一天的历史数据 * 缺点: * 占用了太多的存储空间 4. **基于日志的CDC** 最复杂和最没有入侵的 CDC 方式就是基于日志的方式。数据库会把每个插入、更新和删除操作记录在日志里。只要在数据库中开启事务日志,再将日志读取出来,就可以还原这部分变化数据了。 * 缺点: * 复杂 * 只能用来处理一种特定的数据库。 例如在 mysql 中,启用 log_bin 日志,并使用 mysqlbinlog 工具读取出来,步骤如下: (1)查看是否开启了二进制日志 ```sql show variables like '%log_bin%'; --结果如下: Variable_name value 1og_bin OFF(默认是关闭的) log_bin_trust_function_oreators OFF sql_log_bin ON ``` (2)如果没有开启。 找到 mysql 的配置文件`my.cnf`,一般在/etc,在[mysqld]下面添加 ``` log-bin=/var/log/mysql-bin ``` 然后重启 mysql 服务。 (3)插入一条测试数据并查看日志信息 ``` INSERT INTO dim_date VALUES (NULL,'2050-01-02',1,'January',1,2050); -- 查看日志 show master status; 或者 SHOW MASTER LOGS; -- 输出为: Log-name File_size mysql-bin.000001 271 ``` (4)查看日志,在 shell 下执行 ```shell -- 登录MySQL [root@hadoop101 /]# mysqlbinlog --start-position=0 mysql-bin.000001 | mysql -uroot -p123456 -- 把日志文件输出到文本文件中 [root@hadoop101 /]# mysqlbinlog –start-date=’2018-11-25’ –end-date=’2018-11-26’mysql-bin.000001 > /tmp/000001.txt ``` 执行文本文件的 sql 语句就可以了。基于日志的 CDC 也有缺陷,即只能用来处理一种特定的数据库。 <br/> 现在国内用的比较多的插件是 canal [阿里系]。