1. 场景

工具:PDI (Pentaho Data Integration,旧名字是 Kettle)

使用 mysql-connector-java-8.0.xx.jar 时,Kettle Transformation (.ktr)文件中采用 MySQLBulkLoader 从管道 fifo 文件读数据写到 MySQL 数据库中。

2. 问题

从管道文件(本地数据)读数据往远端 MySQL 服务器写数据时,会执行 LOAD DATA LOCAL INFILE sql 语句,
由于 LOAD DATA LOCAL INFILE 语句存在安全漏洞(参考:官方文档 Security Considerations for LOAD DATA LOCAL ),
在生成 mysql-connector-java-8.0.xx.jar 时,默认把 LOAD DATA LOCAL INFILE sql 语句禁用了,
所以会提示 Couldn't execute SQL: LOAD DATA LOCAL INFILE

出现问题时的 log:

org.pentaho.di.core.exception.KettleDatabaseException
Couldn't execute SQL: LOAD DATA LOCAL INFILE ......
The used command is not allowed with this MySQL version
Caused by: java.sql.SQLSyntaxErrorException: The used command is not allowed with this MySQL version

3. 解决方法

Client 端(PDI 工具所在的服务器)在连接数据库的 URL 中添加 allowLoadLocalInfile=true
需要注意的是 allowLoadLocalInfile 是小写字母开头。

例如:jdbc:mysql://host:port/db_name?allowLoadLocalInfile=true

还需要打开 MySQL Bulk Loader (Kettle 中的)的设置 Local data 勾选上。
在 .ktr 文件中,显示的是这样: <local>Y</local>

4. 参考

https://mysqlconnector.net/troubleshooting/load-data-local-infile/
需要注意的是 allowLoadLocalInfile 是小写字母开头。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐