在 Linux Ubuntu 中使用 Apache NiFi 时无法连接到 MySQL 数据库
Not able to connect to MySQL database when using Apache NiFi in Linux Ubuntu
我正在尝试在 上使用 Apache NiFi 连接到 AWS 中的 MySQL RDS 实例LinuxUbuntu.
MySQL 数据库位于 SSH 隧道后面,该隧道在专用终端中运行。 MySQL 数据库可以通过另一个 Linux 终端访问。
$ ssh -i /home/bernardo/.ssh/sshbernardo3.pem -N \
-L 33061:<db_name>.<id>.eu-west-1.rds.amazonaws.com:3306 \
<user>@<ip_address> -p <port>
我已经从 https://downloads.mysql.com/archives/c-j/
上传并解压了 JDBC driver
文件java.sql.Driver位于Linux
目录/usr/share/java/META-INF/services
我已经在 Linux 中安装了 jdbc 连接器并设置用户使用 JDBC
$ sudo apt-get install libmysql-java
$ cd /home/bernardo
$ gedit .bashrc
在文件末尾添加了以下行:
# Setting up the user to use JDBC
CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-8.0.26.jar
export CLASSPATH
然后来源:
$ source .bashrc
在 NiFi 中,我使用了 DBCPConnectionPool1.15.2 控制器服务,其配置如下:
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库 Driver Class 名称:java.sql.Driver
• 数据库 Driver 位置:/usr/share/java/META-INF/services
• 数据库用户:<db_user>
• 密码:<db_password>
启用控制器服务时,出现以下错误:
StandardControllerServiceNode[service=DBCPConnectionPool[id=2440f624-017e-1000-9467-8bb12dda6ca6],
name=<controller_service_name>, active=true] Failed to invoke
@OnEnabled method due to java.lang.NoSuchMethodException:
java.sql.Driver.() causes: java.lang.InstantiationException:
java.sql.Driver causes:
org.apache.nifi.processor.exception.ProcessException: Creating driver
instance is failed: Creating driver instance is failed
有什么提示吗?
这是我安装的软件:
Linux Ubuntu VirtualBox 6.1 中的 18.04.6 在 Windows 10 Pro
之上
openjdk 版本“11.0.13”2021-10-19
javac 11.0.13
nifi-1.15.2
谢谢,
贝尔纳多
编辑于 2022 年 1 月 6 日 08:50 UTC
我对 DBCPConnectionPool1.15.2 控制器服务配置进行了以下更改:
• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar
其他参数不变:
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库用户:<db_user>
• 密码:<db_password>
文件 mysql-connector-java-8.0.26.jar
在 /usr/share/java
还有:
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver
并且:
$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4873/ssh
tcp6 0 0 ::1:33061 :::* LISTEN 4873/ssh
仍然出现错误(这次是 新错误):
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
访问 driver jar 文件的权限:
bernardo@BDi-laptop:/usr/share/java$ ls -l
-rwxrwxr-- 1 bernardo bernardo 2462344 gen 4 19:01 mysql-connector-java-8.0.26.jar
编辑于 2022 年 1 月 6 日 10:21 UTC
也在 /etc/environment
中添加了 CLASSPATH 变量
bernardo@BDi-laptop:/usr/share/java$ echo $CLASSPATH
.:/usr/share/java/mysql-connector-java-8.0.26.jar:/usr/share/java/mysql-connector-java-8.0.26.jar
编辑于 2022 年 1 月 7 日 09:08 UTC
我认为这可能是与 driver 版本 有关的问题,所以我 re-installed jdbc driver。我已经从旧的 sql 相关文件中清除了 /home/bernardo/Download
和 /usr/share/java
。然后我又安装了一遍
安装 jdbc 连接器
$ sudo apt-get install libmysql-java
.jar 文件在 /usr/share/java/mysql-connector-java-5.1.45.jar
解压 .jar 文件
$ sudo jar xvf /usr/share/java/mysql-connector-java-5.1.45.jar
要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver
driverclass名字是:com.mysql.jdbc.Driver
这是 Apache 中 DBCPConnectionPool1.15.2 控制器服务的更新配置 Ni-Fi:
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库用户:<db_user>
• 密码:<db_password>
我得到了同样的结果:
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
然后我检查了问题是否在 SSH 隧道。
$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4497/ssh
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:33061 :::* LISTEN 4497/ssh
$ cat /proc/4497/status
Name: ssh
State: S (sleeping)
SSH 进程处于休眠状态。
在一个单独的终端中,我访问了远程 MySQL 数据库:
$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061
最后,我尝试使用以下 Ni-Fi 设置连接到本地 Linux 实例中的本地 mysql 数据库:
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库连接 URL:jbdc:mysql://127.0.0.1:3306/<local_db_name>
• 数据库用户:<local_db_user>
• 密码:<local_db_password>
我得到了同样的结果:
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
不过,在单独的 Linux 终端中,我可以访问本地 mysql 数据库:
$ mysql -u <local_db_user> -p -h 127.0.0.1 -P 3306
编辑于 2022 年 1 月 10 日 11:58 UTC
更正了 Ni-Fi 控制器服务配置中的拼写错误:
• 数据库连接 URL:jdbc:mysql://127.0.0.1:33061/
控制器服务问题已解决!
谢谢!
编辑于 2022 年 1 月 12 日 08:26 UTC
我仍然遇到连接问题。我设法启用了控制器服务,但是,当我 运行 处理器 QueryDatabaseTable 时,我收到以下错误:Cannot create PoolableConnectionFactory - Communications link failure
QueryDatabaseTable[id=017e1003-c2d8-14cf-4e34-feee76411595] Unable to execute SQL select query SELECT * FROM periodic_measurements_test due to java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.): javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
↳ causes: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
↳ causes: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.)
↳ causes: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.)
处理器配置为默认配置,除了:
• 数据库连接池服务:
• 数据库类型:MySQL
• Table 姓名:periodic_measurements_test
控制器服务配置仍然是:
• 数据库连接 URL:[=57=
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库用户:<db_user>
• 密码:<db_password>
SSH 隧道似乎没问题:
netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 29483/ssh
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8443 0.0.0.0:* LISTEN -
并且在 Linux 终端中,我仍然可以通过 CLI 访问 MySQL 数据库:
$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061
当我尝试从本地 Linux 实例中的 MySQL 数据库获取数据时,我得到了相同的结果。
最后,我设法解决了这个问题。跟jdbcdriver.
的版本有关
我做了以下事情:
在 Linux 浏览器中转到 https://dev.mysql.com/downloads/connector/j/
Select
• Ubuntu Linux
• 18.04
下载
在 CLI 终端中转到下载目录
$ cd /home/bernardo/Downloads
解压 deb 文件
$ sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu18.04_all.deb
检查连接器在文件系统中的位置
$ dpkg -L mysql-connector-java | fgrep jar
/usr/share/java/mysql-connector-java-8.0.26.jar
从之前的 jdbc driver
中清除 /usr/share/java
$ sudo rm mysql-connector-java-5.1.45.jar
$ sudo rm -r com
$ sudo rm -r META-INF/
安装连接器:解压 .jar 文件
$ sudo jar xvf /usr/share/java/mysql-connector-java-8.0.26.jar
要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver
driver class 名称是:com.mysql.jdbc.Driver
重新启动 Apache Ni-Fi
修改控制器服务的配置:
• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar
我正在尝试在 上使用 Apache NiFi 连接到 AWS 中的 MySQL RDS 实例LinuxUbuntu.
MySQL 数据库位于 SSH 隧道后面,该隧道在专用终端中运行。 MySQL 数据库可以通过另一个 Linux 终端访问。
$ ssh -i /home/bernardo/.ssh/sshbernardo3.pem -N \
-L 33061:<db_name>.<id>.eu-west-1.rds.amazonaws.com:3306 \
<user>@<ip_address> -p <port>
我已经从 https://downloads.mysql.com/archives/c-j/
上传并解压了 JDBC driver文件java.sql.Driver位于Linux
目录/usr/share/java/META-INF/services
我已经在 Linux 中安装了 jdbc 连接器并设置用户使用 JDBC
$ sudo apt-get install libmysql-java
$ cd /home/bernardo
$ gedit .bashrc
在文件末尾添加了以下行:
# Setting up the user to use JDBC
CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-8.0.26.jar
export CLASSPATH
然后来源:
$ source .bashrc
在 NiFi 中,我使用了 DBCPConnectionPool1.15.2 控制器服务,其配置如下:
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库 Driver Class 名称:java.sql.Driver
• 数据库 Driver 位置:/usr/share/java/META-INF/services
• 数据库用户:<db_user>
• 密码:<db_password>
启用控制器服务时,出现以下错误:
StandardControllerServiceNode[service=DBCPConnectionPool[id=2440f624-017e-1000-9467-8bb12dda6ca6], name=<controller_service_name>, active=true] Failed to invoke @OnEnabled method due to java.lang.NoSuchMethodException: java.sql.Driver.() causes: java.lang.InstantiationException: java.sql.Driver causes: org.apache.nifi.processor.exception.ProcessException: Creating driver instance is failed: Creating driver instance is failed
有什么提示吗?
这是我安装的软件:
Linux Ubuntu VirtualBox 6.1 中的 18.04.6 在 Windows 10 Pro
之上openjdk 版本“11.0.13”2021-10-19
javac 11.0.13
nifi-1.15.2
谢谢,
贝尔纳多
编辑于 2022 年 1 月 6 日 08:50 UTC
我对 DBCPConnectionPool1.15.2 控制器服务配置进行了以下更改:
• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar
其他参数不变:
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库用户:<db_user>
• 密码:<db_password>
文件 mysql-connector-java-8.0.26.jar
在 /usr/share/java
还有:
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver
并且:
$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4873/ssh
tcp6 0 0 ::1:33061 :::* LISTEN 4873/ssh
仍然出现错误(这次是 新错误):
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
访问 driver jar 文件的权限:
bernardo@BDi-laptop:/usr/share/java$ ls -l
-rwxrwxr-- 1 bernardo bernardo 2462344 gen 4 19:01 mysql-connector-java-8.0.26.jar
编辑于 2022 年 1 月 6 日 10:21 UTC
也在 /etc/environment
中添加了 CLASSPATH 变量bernardo@BDi-laptop:/usr/share/java$ echo $CLASSPATH
.:/usr/share/java/mysql-connector-java-8.0.26.jar:/usr/share/java/mysql-connector-java-8.0.26.jar
编辑于 2022 年 1 月 7 日 09:08 UTC
我认为这可能是与 driver 版本 有关的问题,所以我 re-installed jdbc driver。我已经从旧的 sql 相关文件中清除了 /home/bernardo/Download
和 /usr/share/java
。然后我又安装了一遍
安装 jdbc 连接器
$ sudo apt-get install libmysql-java
.jar 文件在 /usr/share/java/mysql-connector-java-5.1.45.jar
解压 .jar 文件
$ sudo jar xvf /usr/share/java/mysql-connector-java-5.1.45.jar
要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver
driverclass名字是:com.mysql.jdbc.Driver
这是 Apache 中 DBCPConnectionPool1.15.2 控制器服务的更新配置 Ni-Fi:
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库连接 URL:jbdc:mysql://127.0.0.1:33061/<db_name>
• 数据库用户:<db_user>
• 密码:<db_password>
我得到了同样的结果:
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
然后我检查了问题是否在 SSH 隧道。
$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4497/ssh
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:33061 :::* LISTEN 4497/ssh
$ cat /proc/4497/status
Name: ssh
State: S (sleeping)
SSH 进程处于休眠状态。
在一个单独的终端中,我访问了远程 MySQL 数据库:
$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061
最后,我尝试使用以下 Ni-Fi 设置连接到本地 Linux 实例中的本地 mysql 数据库:
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库连接 URL:jbdc:mysql://127.0.0.1:3306/<local_db_name>
• 数据库用户:<local_db_user>
• 密码:<local_db_password>
我得到了同样的结果:
causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL
不过,在单独的 Linux 终端中,我可以访问本地 mysql 数据库:
$ mysql -u <local_db_user> -p -h 127.0.0.1 -P 3306
编辑于 2022 年 1 月 10 日 11:58 UTC
更正了 Ni-Fi 控制器服务配置中的拼写错误:
• 数据库连接 URL:jdbc:mysql://127.0.0.1:33061/
控制器服务问题已解决!
谢谢!
编辑于 2022 年 1 月 12 日 08:26 UTC
我仍然遇到连接问题。我设法启用了控制器服务,但是,当我 运行 处理器 QueryDatabaseTable 时,我收到以下错误:Cannot create PoolableConnectionFactory - Communications link failure
QueryDatabaseTable[id=017e1003-c2d8-14cf-4e34-feee76411595] Unable to execute SQL select query SELECT * FROM periodic_measurements_test due to java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.): javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) ↳ causes: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. ↳ causes: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.) ↳ causes: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.)
处理器配置为默认配置,除了:
• 数据库连接池服务:
• 数据库类型:MySQL
• Table 姓名:periodic_measurements_test
控制器服务配置仍然是:
• 数据库连接 URL:[=57=
• 数据库 Driver Class 名称:com.mysql.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-5.1.45.jar
• 数据库用户:<db_user>
• 密码:<db_password>
SSH 隧道似乎没问题:
netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 29483/ssh
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8443 0.0.0.0:* LISTEN -
并且在 Linux 终端中,我仍然可以通过 CLI 访问 MySQL 数据库:
$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061
当我尝试从本地 Linux 实例中的 MySQL 数据库获取数据时,我得到了相同的结果。
最后,我设法解决了这个问题。跟jdbcdriver.
的版本有关我做了以下事情:
在 Linux 浏览器中转到 https://dev.mysql.com/downloads/connector/j/
Select
• Ubuntu Linux
• 18.04
下载
在 CLI 终端中转到下载目录
$ cd /home/bernardo/Downloads
解压 deb 文件
$ sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu18.04_all.deb
检查连接器在文件系统中的位置
$ dpkg -L mysql-connector-java | fgrep jar
/usr/share/java/mysql-connector-java-8.0.26.jar
从之前的 jdbc driver
中清除 /usr/share/java$ sudo rm mysql-connector-java-5.1.45.jar
$ sudo rm -r com
$ sudo rm -r META-INF/
安装连接器:解压 .jar 文件
$ sudo jar xvf /usr/share/java/mysql-connector-java-8.0.26.jar
要查找 driver class 名称,请打开 /usr/share/java/META-INF/services/java.sql.Driver
$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver
driver class 名称是:com.mysql.jdbc.Driver
重新启动 Apache Ni-Fi
修改控制器服务的配置:
• 数据库 Driver Class 名称:com.mysql.cj.jdbc.Driver
• 数据库 Driver 位置:/usr/share/java/mysql-connector-java-8.0.26.jar