ORACLE CDC代码问题

Oracle CDC
1. SUPPLEMENTAL LOG在库和表上都需要执行,不是只有表上

ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

2. 报错:Caused by: io.debezium.DebeziumException: Supplemental logging not configured for table xxx. Use command: ALTER TABLE xxx ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS

解答:第一检查oracle表是否已经执行命令 ALTER TABLE xxx ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS,假如已经执行了,但是还是报错,那就不是oracle这边的问题。对于 oracle11 版本,debezium 会默认把 tableIdCaseInsensitive 设置为true, 导致表名被更新为小写,因此在oracle中查询不到 这个表补全日志设置,导致误报这个Supplemental logging not configured for table 错误”。 添加 debezium 的配置项 'database.tablename.case.insensitive' = 'false', 如果使用 SQL 的方式,则在表的 option 中添加配置项 'debezium.database.tablename.case.insensitive' = 'false'

3. OracleCDC的归档日志增长很快,且读取log慢,导致捕捉数据变化延迟较大

解答:可以使用在线挖掘的模式,不写入数据字典到 redo log 中,但是这样无法处理 DDL 语句(但是对于生产环境,一般不会进行 DDL 操作,业务上也仅需要捕捉 DML 操作即可)。生产环境默认策略读取 log 较慢,且默认策略会写入数据字典信息到 redo log 中导致日志量增加较多,可以添加如下 debezium 的配置项。 'log.mining.strategy' = 'online_catalog','log.mining.continuous.mine' = 'true'。如果使用 SQL 的方式,则需要在配置项中加上前缀 'debezium.',即:
'debezium.log.mining.strategy' = 'online_catalog',
'debezium.log.mining.continuous.mine' = 'true'

MySQL CDC 
1. 在mysql cdc里已经指定了'server-time-zone' = 'Asia/Shanghai',但是使用jdbc connector写到另外一个mysql表里时,timestamp的时间还是不对,这里需要在jdbc connector里的url里也要写上时区,即sink表的 url后面加上 &serverTimezone=Asia/Shanghai

2. 有时,我们的业务需求是过滤对删除操作的同步,即监听的binlog里过滤掉删除操作,则可以加上配置,'debezium.skipped.operations'='d',d代表删除操作,u代表更新操作,c代表插入新增操作。详见:https://debezium.io/documentation/reference/stable/connectors/mysql.html

3. 在使用datastream api时读出来的datatime和timestamp的时区问题:在使用datastream api读出来的datatime类型数据,会将年月日的数据类型读成时间戳的类型,那是因为binlog在存储datatime数据类型时,就是用时间戳的形式存储的,且该时间搓有时区问题,和现实时间差8小时,timestamp类型的数据读出来虽然不是时间戳类型的,但是依然会有8小时的时区差异,所以在使用datastream api时需要手动进行时区转换(datastream api目前没有找到其他解决方案)
但使用sql api时,读取datatime类型的数据时,只需要将该字段类型定义为timestamp去读取,就能解决时区和时间戳的问题,timestamp类型的数据正常读取即可,但是在使用sql api写入mysql时,需要在输出库中配置一下时区为+8:00,避免写入时造成时区问题,否则时间会相差12-13小时。

4. 目前cdc2.2.1都还是存在datastream api读取时,假如读取的表没有主键,会直接报错,但是使用sql api却可以指定'scan.incremental.snapshot.enabled' = 'false'来读取没有主键的表。
 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值