应该是有大事务时,会出现下面的异常,canal会解析不过去。
2018-01-12 12:45:20.537 [destination =xxxx , address = /xxxxxx , EventParser] ERROR c.a.o.canal.parse.inbound.mysql.dbsync.DirectLogFetcher - I/O error while reading from client socket java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.007177' at 998888207, the last event read from './mysql-bin.007177' at 123, the last byte read from './mysql-bin.007177' at 998888226. at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher.fetch(DirectLogFetcher.java:95) ~[canal.parse-1.0.19.jar:na] at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:117) [canal.parse-1.0.19.jar:na] at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:209) [canal.parse-1.0.19.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_76]
看到有一个关于max_allowed_packet的issues,#85, 貌似是为了解决这个问题加了组包的逻辑,但是好像没有什么效果,大家有遇到这个问题的么?
原提问者GitHub用户lan1994
建议在mysql端修改全局的max_allowed_packet,canal本身支持多packet的重新组包
原回答者GitHub用户agapple
是的,如果有大事务,会出现该异常,这是因为在MySQL中默认max_allowed_packet参数的值较小,无法处理大事务的数据,以至于发生了数据包过大的错误。此时需要在MySQL的配置文件中将该参数的值增大。另外,可以调整Canal的参数来缓解此问题,例如增加batchSize和slaveId参数的值,并将enableTsdb参数设置为false。如果这些调整仍然无法解决问题,可以考虑分割大事务或升级硬件或软件来处理更大的事务。
从错误日志来看,这个问题可能与max_allowed_packet参数有关。max_allowed_packet参数用于限制MySQL服务器允许接收的数据包的最大大小。当数据包超过这个限制时,就会出现这个错误。
你可以试下以下方式:
增加max_allowed_packet的值。通过修改MySQL服务器的配置文件来实现这一点。找到max_allowed_packet设置,并将其值增加到一个更大的数字。记得重启数据库服务。
如果您无法修改服务器配置,您可以尝试在客户端连接时设置max_allowed_packet。
如果还有更详情的错误信息,请再补充,以便我们快速定位。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。