我正在尝试在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