Caused by: java.lang.NoSuchMethodError: com.mysql.cj.CharsetMapping.getJavaEncodingForMysqlCharset(Ljava/lang/String;)Ljava/lang/String;
at io.debezium.connector.mysql.MySqlValueConverters.charsetFor(MySqlValueConverters.java:331) ~[debezium-connector-mysql-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.connector.mysql.MySqlValueConverters.converter(MySqlValueConverters.java:298) ~[debezium-connector-mysql-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.TableSchemaBuilder.createValueConverterFor(TableSchemaBuilder.java:400) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.TableSchemaBuilder.convertersForColumns(TableSchemaBuilder.java:321) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.TableSchemaBuilder.createValueGenerator(TableSchemaBuilder.java:246) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.TableSchemaBuilder.create(TableSchemaBuilder.java:138) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.RelationalDatabaseSchema.buildAndRegisterSchema(RelationalDatabaseSchema.java:130) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at io.debezium.relational.HistorizedRelationalDatabaseSchema.recover(HistorizedRelationalDatabaseSchema.java:52) ~[debezium-core-1.5.4.Final.jar!/:1.5.4.Final]
at com.ververica.cdc.connectors.mysql.debezium.task.context.StatefulTaskContext.validateAndLoadDatabaseHistory(StatefulTaskContext.java:163) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at com.ververica.cdc.connectors.mysql.debezium.task.context.StatefulTaskContext.configure(StatefulTaskContext.java:114) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at com.ververica.cdc.connectors.mysql.debezium.reader.SnapshotSplitReader.submitSplit(SnapshotSplitReader.java:93) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at com.ververica.cdc.connectors.mysql.debezium.reader.SnapshotSplitReader.submitSplit(SnapshotSplitReader.java:64) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at com.ververica.cdc.connectors.mysql.source.reader.MySqlSplitReader.checkSplitOrStartNext(MySqlSplitReader.java:163) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at com.ververica.cdc.connectors.mysql.source.reader.MySqlSplitReader.fetch(MySqlSplitReader.java:73) ~[flink-connector-mysql-cdc-2.2.1.jar!/:2.2.1]
at org.apache.flink.connector.base.source.reader.fetcher.FetchTask.run(FetchTask.java:56) ~[flink-connector-base-1.13.3.jar!/:1.13.3]
at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.runOnce(SplitFetcher.java:140) ~[flink-connector-base-1.13.3.jar!/:1.13.3]
at org.apache.flink.connector.base.source.reader.fetcher.SplitFetcher.run(SplitFetcher.java:103) ~[flink-connector-base-1.13.3.jar!/:1.13.3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_151]
查看 FlinkListener.jar 包中的lib目录下是否有相关mysql依赖
[root@jenkinspc25 tools]# jar -tvf FlinkListener.jar | grep mysql.*.jar
251194 Tue Apr 26 19:08:40 CST 2022 BOOT-INF/lib/flink-connector-mysql-cdc-2.2.1.jar
370666 Thu Jul 01 01:03:16 CST 2021 BOOT-INF/lib/debezium-connector-mysql-1.5.4.Final.jar
192762 Tue Apr 20 16:13:28 CST 2021 BOOT-INF/lib/mysql-binlog-connector-java-0.25.1.jar
2397321 Tue Jun 16 17:17:36 CST 2020 BOOT-INF/lib/mysql-connector-java-8.0.21.jar
而报错提示的 CharsetMapping 类在 mysql-connector-java-8.0.21.jar 依赖中.
使用 -XX:+TraceClassLoading 查看类的加载情况
java -XX:+TraceClassLoading -jar FlinkListener.jar > FlinkListener.log &
查看 FlinkListener.log 文件, 定位到 CharsetMapping 关键字
CharsetMapping 这个类是从 /home/java/jre/lib/ext/mysql-connector-java-8.0.27.jar 加载的, 并不是从 FlinkListener.jar!/BOOT-INF/lib 目录下加载 .
天真的以为, 把 /home/java/jre/lib/ext 目录下的 mysql-connector-java-8.0.27.jar 名称改成 mysql-connector-java-8.0.27.jar.remove 就可以, 哪知道它依然会从 mysql-connector-java-8.0.27.jar.remove 加载,如下所示
通过 file 命令查看, 它的确还是JAR类型 (不能以貌取人,不能以貌判断一个文件的类型)
[root@localhost ext]# file mysql-connector-java-8.0.27.jar.remove
mysql-connector-java-8.0.27.jar.remove: Java archive data (JAR)
【解决方案】
1.直接移除 /home/java/jre/lib/ext 目录下的 mysql-connector-java-8.0.27.jar 包. 但可能会影响其它的程序,未采用此方案
2.其他方案 待定