Alibaba Canal 使用记录

news/2024/7/7 20:22:32

项目中使用 canal 来同步数据到 Elasticsearch, 遇到很多问题,做一下记录:

版本问题:

1. 解析binlog出错 ,表现为 limit excceed:xx

目前使用 mariadb 10.9.7/10.10.6 + canal 1.1.6 hotfix ,在这个版本组合中只要binlog中出现对表结构操作的SQL语句就会出错并卡住。

解决办法:

(1)每次在对表结构操作后重启数据库服务,这样会新建一个binlog 文件 。

(2)升级到1.1.7, release说明中说支持mariadb 10.10.x的binlog, 但目前1.1.7是alpha版,从isuse上看此版本的问题还是挺多的,我也简单的试了一下1.1.7-alpha-2版本,在配置没有任何更改的情况下无法同步,查看adapter日志能发现DML#4796,但就是不同步到es, 这种情况可能是配置问题,但由于不想使用alpha版本没有更详细的测试,等到正式版出了再说。

2.日志能发现DML,但不能同步到ES。

这种错误出现的最多,引起的原因也五花八门,目前发现以下原因:

(1)filter配置的问题,这种情况从日志能够看出来,首先deployer在启动时会在日志中打印出转意后的正则,可查看和自己设置的是否一致。另外如果filter通过了在DML日志后会根一条带有data 的日志。

(2)filter的正则问题,filter正则过滤真是让我挠头。

a.  canal会自动为正则加"^"和“$",所以配置时不能再加了,多个正则用逗号分隔。

b.  正则写的时候需要按Java字符串转义后再按正则转义,例如想配置"."那么要写成 "\\.",其中"\\"是java字符串转义,转成"\.", "\"是按正则转义,对"."转义

c.  官方说明过滤内容是  "库名.表名" ,但我设置 :

canal.instance.filter.regex=record_.+\\..*

是想仅同步数据库名以"record_"开头的所有表。但是设置后所有的同步都失效了,目前没有解决,使用了默认的 ".*\\..*"。

(3) sql错误

canal 对sql写法是有要求的,并不是能执行的就行,目前已知的要求有:

a.  只支持 left join

b. 第一个表必须是主表

c. 主表的主键字段名必须是_id

d. left join on 中使用的条件字段必须包含在select 选择列中

e. 不支持多级嵌套查询

对SQL的检查最好是先启动canal,然后再把写好yml文件拷到配置目录中,这时查看日志,会看到动态加载的日志,如果成功就说明sql没问题,否则会出现加载出错信息。

3.关于时间日期类型:

参见 elasticsearch 时间日期格式

我需要的时间格式是 yyyy-MM-ddTHH:mm:ss.SSSZ 

sql 的写法: 

select DATE_FORMAT(CONVERT_TZ(created_at, @@session.time_zone, 'GMT'), '%Y-%m-%dT%T.000Z') as created_at form table

我遇到了个奇怪的问题,这个本来是好用的,可是后来不知什么原因,突然就不行了,所有的时间都成了空,而如果是使用 json_object方式的还是好用的。

left join (select wi.work_id, JSON_ARRAYAGG(JSON_OBJECT('type',type,'emp_id',emp_id,'emp_name',emp_name,'org_id',org_id,'org_name',org_name,'work_time',DATE_FORMAT(CONVERT_TZ(work_time, @@session.time_zone, 'GMT'), '%Y-%m-%dT%T.000Z'))) as items from work_item wi group by wi.work_id order by work_time desc ) it on it.work_id = w.work_id

找了半天也没找到原因,怀疑是引号的问题,看到elasticsearch 还支持 epoch_millis 格式,所以使用以下方式得到 epoch_millis :

ROUND(unix_timestamp(created_at) * 1000) as created_at

mappings 定义

        "updated_at": {
          "type": "date",
          "format": "yyyy-MM-ddTHH:mm:ss.SSSZ||epoch_millis"
        },


http://lihuaxi.xjx100.cn/news/1527465.html

相关文章

PHP请求API接口案例采集电商平台数据获取淘宝/天猫优惠券查询示例

优惠券查询API接口对于用户和商家来说具有重要作用,可以方便地获取优惠券信息,进行优惠券搜索和筛选,参与活动和促销推广,提供数据分析和决策支持,提升用户体验和忠诚度,为商家增加销售额和市场竞争力。 t…

【容器vs虚拟机】

容器vs虚拟机 为什么用虚拟机什么是容器容器vs虚拟机 Docker被称为是轻量级的虚拟化。 首先,一般开发所需要的都是Linux环境,但我们大多数人的电脑都是Windows系统。所以要安装虚拟机,目的是为了在我们当前所使用的Windows上面安装上Linux环境…

minimumLineSpacing和minimumInteritemSpacing问题研究

结论:minimumLineSpacing和minimumInteritemSpacing问题研究 (1)如果cell的宽度是固定的,方向是水平时, 1 3 5 2 4 6 minimumLineSpacing 是 12 到 34的距离 minimumInteritemSpacing 是1到2的距离 (2)如果cell的宽度是不固定的&#xff0…

促进合作交流|旅游专业老师在加拿大访学期间取得初步成果

N老师拟申报CSC,指定国家且要求接收学校不收取板凳费,最终我们分别获得了澳大利亚科廷大学和加拿大圭尔夫大学的邀请函(均未收取板凳费)。N老师用前者申报了CSC并获批,因签证原因又用后者申请了改派,并在加…

无法维护代码特点

一、程序命名 容易输入的变量名 。比如:Fred,asdf 单字母的变量名 。比如:a,b,c, x,y,z(如果不够用,可以考虑a1,a2,a3,a4,….) 有创意地拼写错误 。比如:SetPintleOpening, SetPin…

适用于Linux的Windows子系统(在VScode中开发Linux项目)

目录 前言 一、VScode扩展安装 二、挂载项目 1.连接 2.挂载(挂载之后项目终端就是Linux了) 3.愉快的搬砖开始了 4.前端如何通过内网 IP 本地访问到 Ubuntu 上? 总结 前言 系列分为三章(从安装到项目使用)&…

【U盘】实现U盘清空并重置恢复存储

打开电脑,将U盘插入USB端口,点按快捷键【WinR】,弹出运行对话框,输入命令 diskpart 进入命令提示符窗口 输入指令 list disk 查看现在的硬盘 这里显示的U盘编号是“1”,因此输入select disk “1”,就是选择…

Linux常用(实用)命令大全

pwd 显示当前工作路径 shutdown 关闭系统 /halt 关闭系统 shutdown -r now 重启 /reboot 重启 systemctl stop firewalld 关闭防火墙 ip addr 查看ip地址. 1、cd命令:用于切换当前目录(可以是绝对路径,也可以是相对路径)如&#x…