在Linux Ubuntu中使用Apache NiFi时无法连接到MySQL数据库



我正在尝试在Linux Ubuntu上使用Apache NiFi连接到 AWS 中的MySQLRDS 实例。

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 驱动程序

文件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控制器服务,其配置如下:

• 数据库连接网址:jbdc:mysql://127.0.0.1:33061/<db_name>

• 数据库驱动程序类名:java.sql.Driver

• 数据库驱动程序位置:/usr/share/java/META-INF/services

• 数据库用户:<db_user>

• 密码:<db_password>

启用控制器服务时,出现以下错误:

StandardControllerServiceNode[service=DBCPConnectionPool[id=2440f624-017e-1000-9467-8bb12dda6ca6], 名称=,活动=真] 调用失败 由于java.lang.NoSuchMethodException@OnEnabled方法: java.sql.Driver.() 原因: java.lang.InstantiationException: java.sql.Driver 原因: org.apache.nifi.processor.exception.ProcessException: Create driver 实例失败:创建驱动程序实例失败

有什么提示吗?

这是我安装的软件:

  • Linux Ubuntu 18.04.6 in VirtualBox 6.1 on Windows 10 Pro

  • OpenJDK 版本"11.0.13" 2021-10-19

  • 爪哇 11.0.13

  • 镍-1.15.2

谢谢

伯纳多


编辑于 2022 年 1 月 6 日 08:50 UTC

我对 DBCPConnectionPool1.15.2 控制器服务配置进行了以下更改:

• 数据库驱动程序类名:com.mysql.cj.jdbc.Driver

• 数据库驱动程序位置:/usr/share/java/mysql-connector-java-8.0.26.jar

其他参数不会更改:

• 数据库连接网址: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

我仍然收到一个错误(这次是一个新错误):

原因:org.apache.nifi.processor.exception.ProcessException:给定数据库连接 URL 没有合适的驱动程序

访问驱动程序 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

我认为这可能是与驱动程序版本相关的问题,因此重新安装了jdbc驱动程序。我已经从旧的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

若要查找驱动程序类名称,请打开/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

驱动程序类名称为:com.mysql.jdbc.Driver

这是 Apache Ni-Fi 中 DBCPConnectionPool1.15.2 控制器服务中的更新配置:

• 数据库驱动程序类名:com.mysql.jdbc.Driver

• 数据库驱动程序位置:/usr/share/java/mysql-connector-java-5.1.45.jar

• 数据库连接网址:jbdc:mysql://127.0.0.1:33061/<db_name>

• 数据库用户:<db_user>

• 密码:<db_password>

我得到了相同的结果:

原因:org.apache.nifi.processor.exception.ProcessException:给定数据库连接 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 数据库:

• 数据库驱动程序类名:com.mysql.jdbc.Driver

• 数据库驱动程序位置:/usr/share/java/mysql-connector-java-5.1.45.jar

• 数据库连接网址:jbdc:mysql://127.0.0.1:3306/<local_db_name>

• 数据库用户:<local_db_user>

• 密码:<local_db_password>

我得到了相同的结果:

原因:org.apache.nifi.processor.exception.ProcessException:给定数据库连接 URL 没有合适的驱动程序

尽管如此,在一个单独的 Linux 终端中,我还是能够访问本地的 mysql 数据库:

$ mysql -u <local_db_user> -p -h 127.0.0.1 -P 3306

编辑于 2022 年 1 月 10 日 11:58 UTC

更正了 Ni-Fi 控制器服务配置中的拼写错误:

• 数据库连接网址:jdbc:mysql://127.0.0.1:33061/

控制器服务问题解决了!

谢谢!


编辑于 2022 年 1 月 12 日 08:26 UTC

我仍然遇到连接问题。我设法启用控制器服务,但是当我运行处理器 QueryDatabaseTable 时,出现以下错误:无法创建池连接工厂 - 通信链路故障

QueryDatabaseTable[id=017e1003-c2d8-14cf-4e34-feee76411595] 由于 java.sql.SQLException,无法执行 SQL 选择查询 SELECT * FROM periodic_measurements_test:无法创建 PoolableConnectionFactory (通信链路失败)

从服务器成功接收的最后一个数据包是 0 毫秒前。 成功发送到服务器的最后一个数据包是 0 毫秒前。): javax.net.ssl.SSLHandshakeException: 没有适当的协议(协议被禁用或密码套件不合适) ↳ 原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

从服务器成功接收的最后一个数据包是 0 毫秒前。 成功发送到服务器的最后一个数据包是 0 毫秒前。 ↳ 原因:java.sql.SQLException:无法创建 PoolableConnectionFactory(通信链接失败)

从服务器成功接收的最后一个数据包是 0 毫秒前。 成功发送到服务器的最后一个数据包是 0 毫秒前。 ↳ 原因:org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: 无法创建 PoolableConnectionFactory (通信链路失败)

从服务器成功接收的最后一个数据包是 0 毫秒前。 成功发送到服务器的最后一个数据包是 0 毫秒前。

处理器配置是默认的,但以下配置除外:

• 数据库连接池服务:

• 数据库类型:MySQL

• 表名:periodic_measurements_test

控制器服务配置仍为:

• 数据库连接网址:jdbc:mysql://127.0.0.1:33061/<db_name>

• 数据库驱动程序类名:com.mysql.jdbc.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 数据库中获取数据时,我得到了相同的结果。

最后,我设法解决了这个问题。它与 jdbc 驱动程序的版本有关。

我做了以下工作:

在 Linux 浏览器中,转到 https://dev.mysql.com/downloads/connector/j/

选择

• 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 驱动程序中清除/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

要查找驱动程序类名,请打开/usr/share/java/META-INF/services/java.sql.Driver

$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver

驱动程序类名称为:com.mysql.jdbc.Driver

重新启动 Apache Ni-Fi

使用以下命令修改控制器服务的配置:

• 数据库驱动程序类名:com.mysql.cj.jdbc.Driver

• 数据库驱动程序位置:/usr/share/java/mysql-connector-java-8.0.26.jar

相关内容

  • 没有找到相关文章

最新更新