最近开始做canal数据同步方案。

canl的原理就是伪装成mysql的slave,然后悄悄地“偷数据”,复制数据吧。

至于canal的搭建,自行查看官网 <https://github.com/alibaba/canal/wiki/QuickStart>

mysql添加上配置并且赋上权限之后,最后canal的配置,一般只需要修改conf/example/instance.properties的这四个地方:

 canal.instance.mysql.slaveId = 1234

 canal.instance.master.address = 127.0.0.1:3306

canal.instance.dbUsername = canal
canal.instance.dbPassword = canal

 

 

注意点和坑:

1、有一个坑是,明明数据库账号密码都对了,但是连接报验证失败1045的错误。

查看canal的配置 canal.instance.master.address = 127.0.0.1:3306

而数据库权限的



所以把这个修改了就行:

 canal.instance.master.address = 192.168.1.IP地址:3306

或者权限添加127.0.0.1这个位置,localhost也是不行的。

在很多应用中,都会有这个问题,127.0.0.1不能转换为localhost等,例如
<https://blog.csdn.net/fst438060684/article/details/80662305>。以后记得。


2、初始的时候,conf/example里面是没有meta.dat。启动之后获取到mysql的binlog的位置之后,这里就会有客户端读取的位置和时间戳和binlog文件的信息。

3、启动的时候报错1146错误,这个错误一般是表删除了然后去desc的时候报的错。可以忽略掉。

比较坑爹的就是直接把meta.bat去掉,让canal重新读取。

比较好一点的办法是忽略这个错误。

官网这里面 <https://github.com/alibaba/canal/wiki/AdminGuide>有个

canal.instance.filter.table.error=true



可以忽略掉这个错误

4、修改slave读取的位置

修改conf/examlpe里面的meta.data

journalName=也就是mysql的binlog的名字

position=也就是binlog的位置

timestamp=也就是时间戳

可以通过一下语句找到mysql 的binlog某个位置的具体信息,从而跳过或者进行别的操作:

mysqlbinlog --start-position=281985638 --base64-output=decode-rows -v
/pydtdata/mysqllog/binlog/mylogbin.000435>>/pydata/binlog20180906.sql

## --stop-position=400000000
## --database=pydtcredit_prod_2

5、启动成功的log:



最后红框框里面的内容,如果是没有meta.dat就不会显示

 

6、修改canal监听指定监听特定的数据库名之后,还是会出现1146指定的这个数据库找不到表的错误,而这个表是一个临时表。

是因为canal解析binlog的时候都以主库为标准,主库表删除了,canal同步比较慢,读到删除之前的日志就报错了。主要是同步慢了没跟上主库的节奏。

 

解决是

A、既然他没有那个表,就加上那个表

B、把那个表改为真正的临时表

 

 

7、java内存溢出的问题

启动canal成功,运行一段时间之后出现内存溢出的问题



解决:连接 <https://github.com/alibaba/otter/issues/500>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信