这似乎是重复的帖子,但我检查了相关帖子中发布的所有解决方案,但没有一个对我有用。所以请允许我更准确地陈述问题。
我有一台服务器,安装了MySQL。我有一个用户 X,密码为 P。
如果我连接到服务器(ssh 或其他东西)并尝试在本地运行 MySQL (
mysql --user=X --password==P
),它会完美登录,并且我可以访问所有内容:
mysql> show grants;
...
+------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'X'@'%' IDENTIFIED BY |
|PASSWORD 'somehash' WITH GRANT OPTION |
+------------------------------------------------------+
现在,如果我转到配置文件:(
sudo vim /etc/mysql/my.cnf
)我会看到以下内容:
bind-address = 0.0.0.0
port = 3306
然后我转到主机允许文件(
sudo vim /etc/hosts.allow
)我看到:
mysqld: ALL
然后我进入主机允许文件(
sudo vim /etc/hosts.deny
):该文件是空的(除了一些注释)。
但是,当我尝试连接 MySQL Workbench 时,我遇到了问题。 我是这样做的。我去添加一个新连接,添加 URL、用户名、通行证和端口,然后单击“测试连接”,然后收到该问题的标题消息。我尝试使用随机(不存在)的用户通行证组合,但仍然得到相同的响应。
顺便说一句,我也尝试注释掉绑定地址。此外,该服务器通常还可以访问 PostgreSQL 等其他服务。
您可以尝试从mysql服务器ssh远程端口转发到本地机器,然后将mysql客户端连接到本地端口。每当我位于防火墙后面时,我都会使用此方法。额外的好处是,通过此连接传输的数据也非常安全。
例如,如果您使用 ssh 进入远程计算机
ssh [email protected] -i ~/.ssh/hal.key
然后你可以像这样设置端口转发:
ssh -L 54321:127.0.0.1:3306 [email protected] -i ~/.ssh/hal.key -f -N -M -S ~/.ssh/tunnel_54321_remote_machine_mysql
然后就可以像本地连接数据库一样连接数据库了(以命令行mysql客户端为例):
mysql -h 127.0.0.1 -P 54321 -u my_user -p my_database
然后系统会提示您输入密码。
关闭隧道:
ssh -S ~/.ssh/tunnel_54321_remote_machine_mysql [email protected] -i ~/.ssh/hal.key
我第一次从 postgres 文档了解到这个方法。
这很可能是防火墙问题。
首先进行调试的最简单方法是尝试在本地和远程通过端口 3306 telnet 到服务器。 如果连接正确,MySQL 将以明文形式发送版本字符串,您可以在 telnet 中看到该版本字符串。
如果您没有收到该字符串,则防火墙之类的东西可能会阻止连接。
游戏很晚了,但我在 MySql 15.1 中遇到了同样的问题,并记录了
/var/log/secure
文件,我意识到每次登录都会产生这样的错误:
sshd[2598444]: refused local port forward: originator port 18204, target 127.0.0.1 port 3306
此时我意识到在我的
/etc/ssh/sshd_config
文件中,AllowTcpForwarding 和 GatewayPorts 值被设置为 no 并进行了注释,因此我将它们设置为:
AllowTcpForwarding yes
GatewayPorts yes
那时,我就跑了:
sudo systemctl restart sshd
MySQL 连接工作正常。