问题描述:使用canal1.1.6将mysql中的数据增量同步到elasticsearch中,当配置sql中含有group by语句时,会报空指针异常,错误如下图
目录
问题描述
问题描述:使用canal1.1.6将mysql中的数据增量同步到elasticsearch中,当配置sql中含有group by语句时,会报空指针异常,错误如下图
产生原因:canal1.1.6在解析sql时,代码中未对sql中含有group by的情况做出判断,无脑在sql后添加where语句,导致group by后有where语法,造成sql语句错误
解决思路:下载canal源码,对应解析sql方法中添加group by判断逻辑,替换jar包即可
报错信息
解决办法
第一步:将canal源码下载下来
源码github地址:https://github.com/alibaba/canal
源码git地址:https://github.com/alibaba/canal.git
下面是源码目录内容
第二步:找到client-adapter项目
打开第一步中的client-adapter项目,下载对应的maven依赖
第三步:找到ESSyncUtil工具类
找到ESSyncUtil工具类,此工具类是在escore模块中。路径为escore-src-main-java-com-alibaba-otter-canal-client-adapter-es-core-support-ESSyncUtil.java
第四步:修改appendCondition方法内容
修改appendCondition方法内容,使其对group by做相关校验
public static String appendCondition(String sql, String condition) {
//-----原来代码开始----
// return sql + " WHERE " + condition + " ";
//-----原来代码结束----
// 防止最后出现groupby 导致sql解析异常
String[] sqlSplit = sql.split("GROUP\\ BY(?!(.*)ON)");
String sqlNoWhere = sqlSplit[0];
String sqlWhere = sqlNoWhere + "WHERE" + condition + " ";
if (sqlSplit.length > 1) {
return sqlWhere + "GROUP BY " + sqlSplit[1];
}
System.out.println("======================================sql内容" + sqlWhere);
return sqlWhere;
}
第五步:打包
将下图选中的两个模块打包
【注意:先打包escore模块,再打包es v7x模块】
第六步:替换对应jar包
打完包后找到es7的jar包目录,会生成三个jar包,将下图中选中的jar包复制到canal安装目录的plugin文件夹中,将原先目录中的jar包替换
【记得将canal安装的原始数据备份】
下图中plugin文件夹jar包内容
第七步:重启canal-adapter
重启canal-adapter即可