首页 > 解决方案 > Debezium 连接器无法连接到 MariaDB,错误 'LOAD DATA LOCAL INFILE 但功能在客户端被禁用'

问题描述

我们使用 Debezium 和 Kafka-Connect 从多个 MariaDB 数据库实例中提取数据。大多数数据库的连接器都成功运行,但其中一个连接器失败并出现以下错误:

    at io.debezium.connector.mysql.AbstractReader.wrap(AbstractReader.java:241)
    at io.debezium.connector.mysql.AbstractReader.failed(AbstractReader.java:218)
    at io.debezium.connector.mysql.SnapshotReader.execute(SnapshotReader.java:848)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.sql.SQLException: Server asked for stream in response to LOAD DATA LOCAL INFILE but functionality is disabled at client by 'allowLoadLocalInfile' being set to 'false'.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:814)
    at io.debezium.connector.mysql.SnapshotReader.execute(SnapshotReader.java:764)
    ... 3 more

服务器端变量 local_infile 设置为 ON,因此在服务器端一切都应该没问题。我想一个解决方案可能是以某种方式在连接字符串中传递客户端选项 allowLoadLocalInfile ,但我看不出如何在 Debezium 中配置它。我也觉得这个错误现在弹出很奇怪,而其他连接器没有这个问题。有没有人在使用 Debezium 时认识到这个错误,知道原因甚至有解决方案?

标签: mariadbdebezium

解决方案


我找到了解决方案。在连接器配置中,例如注册/更新连接器的 json 文件我更改了设置: 从这里:

"min.row.count.to.stream.results": "0"

对此:

"min.row.count.to.stream.results": "1000"

当该属性设置为 0 时,将流式传输结果。不知何故,对于一个相当大的表,这导致了上述错误。LOAD DATA LOCAL INFILE 但功能在客户端被“allowLoadLocalInfile”设置为“false”而被禁用

我不知道 mariadb 的大表失败的确切原因,但至少问题得到了解决。


推荐阅读