@楚天乐 先下载和你使用的版本像对应的源码版本,这样堆栈中的行号才会和你源码中的行号互相匹配。
阅读堆栈,定位DEBUG的类和方法
如果看到异常堆栈,可以确定异常的方法和类。例如如下堆栈,可以看到出问题的方法主要是LogBuffer,RowsLogBuffer和LogEventConvert这几个类。选择哪个类和方法debug来诊断问题是有技巧的,主要选择哪些本地变量有一些语义的地方打印日志是比较好的。针对下面这个堆栈,我们查看相关类和方法的源码之后,可以直接在fetchValue这个方法上打断点,因为这边入参有columnName等信息,可以方便我们确定是哪个列的内容解析时产生了这个问题。可以直接加个try-catch,这样方便有异常的时候才进入断点,或者使用IDEA的条件断点也是可以的。
Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed.
Caused by: java.lang.IllegalArgumentException: limit excceed: 258
at com.taobao.tddl.dbsync.binlog.LogBuffer.getInt8(LogBuffer.java:253)
at com.taobao.tddl.dbsync.binlog.event.RowsLogBuffer.fetchValue(RowsLogBuffer.java:286)
at com.taobao.tddl.dbsync.binlog.event.RowsLogBuffer.nextValue(RowsLogBuffer.java:95)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseOneRow(LogEventConvert.java:409)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseRowsEvent(LogEventConvert.java:331)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:101)
at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:61)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser.parseAndProfilingIfNecessary(AbstractEventParser.java:322)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3$1.sink(AbstractEventParser.java:175)
at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:124)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:208)
at java.lang.Thread.run(Thread.java:748)
d2b67497-f739-4787-9e13-112ee2d521dd-image.png
配置和启动程序
源码中相关的几个properties文件也需要配置好canal.properties和instance.properties等。Server可以通过CanalLauncher的main方法启动,然后等待进入断点