diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlConnection.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlConnection.java index c3c633d0..908a36d8 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlConnection.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlConnection.java @@ -37,8 +37,8 @@ public class MysqlConnection implements ErosaConnection { private Charset charset = Charset.forName("UTF-8"); private BinlogFormat binlogFormat; private BinlogImage binlogImage; - private int binlogChecksum; - + private int binlogChecksum; + public MysqlConnection(){ } @@ -117,7 +117,7 @@ public class MysqlConnection implements ErosaConnection { LogDecoder decoder = new LogDecoder(LogEvent.UNKNOWN_EVENT, LogEvent.ENUM_END_EVENT); LogContext context = new LogContext(); context.setLogPosition(new LogPosition(binlogfilename)); - context.setFormatDescription(new FormatDescriptionLogEvent(4,binlogChecksum)); + context.setFormatDescription(new FormatDescriptionLogEvent(4, binlogChecksum)); while (fetcher.fetch()) { LogEvent event = null; event = decoder.decode(fetcher, context); @@ -204,7 +204,7 @@ public class MysqlConnection implements ErosaConnection { // 如果不设置会出现错误: Slave can not handle replication events with the // checksum that master is configured to log // 但也不能乱设置,需要和mysql server的checksum配置一致,不然RotateLogEvent会出现乱码 - // '@@global.binlog_checksum'需要去掉单引号,在mysql 5.6.29下导致master退出 + // '@@global.binlog_checksum'需要去掉单引号,在mysql 5.6.29下导致master退出 update("set @master_binlog_checksum= @@global.binlog_checksum"); } catch (Exception e) { if (!StringUtils.contains(e.getMessage(), "Unknown system variable")) { @@ -266,12 +266,14 @@ public class MysqlConnection implements ErosaConnection { throw new IllegalStateException("unexpected binlog image query result:" + rs.getFieldValues()); } } + /** * 获取主库checksum信息 - * https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#option_mysqld_binlog-checksum + * https://dev.mysql.com/doc/refman/5.6/en/replication-options + * -binary-log.html#option_mysqld_binlog-checksum */ - private void loadBinlogChecksum(){ - ResultSetPacket rs = null; + private void loadBinlogChecksum() { + ResultSetPacket rs = null; try { rs = query("select @master_binlog_checksum"); } catch (IOException e) { @@ -279,13 +281,13 @@ public class MysqlConnection implements ErosaConnection { } List columnValues = rs.getFieldValues(); - if(columnValues.get(0).toUpperCase().equals("CRC32")){ - binlogChecksum = LogEvent.BINLOG_CHECKSUM_ALG_CRC32; - }else{ - binlogChecksum = LogEvent.BINLOG_CHECKSUM_ALG_OFF; + if (columnValues != null && columnValues.size() >= 1 && columnValues.get(0).toUpperCase().equals("CRC32")) { + binlogChecksum = LogEvent.BINLOG_CHECKSUM_ALG_CRC32; + } else { + binlogChecksum = LogEvent.BINLOG_CHECKSUM_ALG_OFF; } } - + public static enum BinlogFormat { STATEMENT("STATEMENT"), ROW("ROW"), MIXED("MIXED");