最近开始做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>
热门工具 换一换