![通过 SSH 连接 MySQL 8.0.20](https://linux22.com/image/753608/%E9%80%9A%E8%BF%87%20SSH%20%E8%BF%9E%E6%8E%A5%20MySQL%208.0.20.png)
Windows 10 上的 DBeaver 7.1.0 尝试使用 SSH 连接到 Ubuntu 20.04 上的 MySQL 8.0.20。我还尝试了其他 Windows MySQL GUI 客户端,结果相同,这让我相信问题出在 MySQL 配置上(或者可能是我的本地 Java 安装?)。
错误信息是:
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
MySQL 版本信息:
# mysql --version
mysql Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
# mysqld --version
/usr/sbin/mysqld Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
从 Windows 命令行,我可以 ssh 到我的服务器并毫无问题地连接到我的数据库:
FROM WINDOWS COMMAND LINE:
ssh [email protected]
FOLLOWED BY THE FOLLOWING ON THE SERVER:
$ mysql -u admin -p
这是全新安装的 MySQL,没有任何配置更改。我所做的唯一一件事就是创建一个虚拟数据库(“main”)和一个新的数据库用户(“admin”)并授予该用户访问数据库的权限。
CREATE DATABASE main;
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'XXX_PASSWORD_REDACTED_XXX';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
SELECT user,plugin,host FROM mysql.user WHERE user='admin';
+-------+-----------------------+-----------+
| user | plugin | host |
+-------+-----------------------+-----------+
| admin | caching_sha2_password | localhost |
+-------+-----------------------+-----------+
1 row in set (0.00 sec)
在 DBeaver 中,单击“测试隧道配置“结果成功,因此 SSH 隧道没有问题。但是单击“测试连接“会导致错误。请参阅下面的错误以及我的配置的屏幕截图。请注意,我尝试使用“MySQL 8+ 驱动程序“ 以及 “MySQL 驱动程序“。我也尝试过同时使用学士和沙特基础工业公司结果相同。我还尝试使用127.0.0.1代替本地主机,结果相同。我还尝试将用户的插件从缓存_sha2_密码到mysql_native_password,结果相同。
MySQL bind-address 是默认值:
# grep -Irs bind /etc/mysql
mysql.conf.d/mysqld.cnf:bind-address = 127.0.0.1
IPTables如下:
# iptables -L -v -n
Chain INPUT (policy DROP 328 packets, 18119 bytes)
pkts bytes target prot opt in out source destination
11517 76M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
141 32322 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
10 492 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
10 576 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6069 packets, 647K bytes)
pkts bytes target prot opt in out source destination
将不胜感激有关如何进一步调试的任何想法!
截图如下:
答案1
呃……算了……我搞明白了。我忘了允许环回连接。通过运行以下命令修复:sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
答案2
我遇到了同样的错误,但事实证明远程 MySQL 服务器没有监听 127.0.0.1:3306,而是监听另一个网络适配器上的内部 IP 地址。
您可能需要检查输出以ss -tnlp
检查哪个 IP 拥有服务器。
如果发现 MySQL 正在监听内部 IP 而不是环回 IP,并且 SSH 服务器允许 TCP 转发,您仍然可以使用 SSH 转发从 DBeaver 连接,方法是打开 SSH 选项卡下的“高级设置”,并将“本地主机:”设置为 127.0.0.1,“本地端口:”设置为 3306,“远程主机:”设置为数据库服务器的内部 IP,将“远程端口:”设置为服务器上 MySQL 的监听端口(通常为 3306)。