背景

使用新库搭建从库,并进行主从切换,主库原有订阅任务报错

2025-05-20 15:44:38.101 [destination = 9685881 , address = /xxxx:xxxx , EventParser] INFO  boot - start with position null
2025-05-20 15:44:38.101 [destination = 9685881 , address = /xxxx:xxxx , EventParser] ERROR c.v.v.d.p.MySQLBinlogParser$EventParser - dump address /xxxx:xxxx has an error, retrying. caused by
java.lang.NullPointerException: null
    at com.xxxx:xxxx.dss.sink.RocketMQEventSink$DummyEntry.of(RocketMQEventSink.java:776)
    at com.xxxx:xxxx.dss.parser.MySQLBinlogParser$EventParser.findStartPosition(MySQLBinlogParser.java:326)
    at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:191)
    at java.base/java.lang.Thread.run(Thread.java:829)

原因分析

解析实例启动时间前的增量恢复的binlog:通过start-datetime(失败)

@#mysqlbinlog -vvv mysql-bin.000002 --start-datetime="2025-05-20 06:00:00"|less

1.png 解析实例启动时间前的增量恢复的binlog:通过start-position(正常)

@#mysqlbinlog -vvv mysql-bin.000002 --start-position="85345"|less

2.png 发现对新加的从库-切换后的主库的binlog分析,使用start-datetime解析实例启动时间之前的应用主库的增量binlog时失败,因此怀疑订阅MySQL变更使用类似start-datetime解析binlog的方法,无法解析实例启动时间之前的应用主库的增量binlog

如何解决

1、订阅可以尝试采用position方式重新初始化日志(未验证) 2、主从切换时要确保切换与新实例启动的时间大于延迟订阅的时间