我已经在两个服务器 A 和 B 之间建立了SSH隧道。 B 有MySQL服务器,这可行:
mysql -h localhost -P 3306 -u user -p
虽然这不是:
mysql -h 127.0.0.1 -P 3306 -u user -p
尽管my.cnf具有以下几行:
bind-address = 127.0.0.1 # Next addr differs slightly, but anyway bind-address = 99.99.99.99
现在关于隧道。它连接以下内容:(A) localhost(9989) -> (B) localhost(3306) 但是当(在 A上 ,端口转发)时,我会
(A) localhost(9989) -> (B) localhost(3306)
mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p
我懂了 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
当我这样做
mysql -v -h localhost -P 9989 -u user userdb -p
我懂了 ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)
ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)
可能是什么原因?我究竟做错了什么?
这里有三个问题。
1-暂时忘记SSH隧道
您不能将MySQL绑定到多个特定IP。第一个bind-address子句被第二个子句覆盖(因此被忽略)。您的服务器仅侦听99.99.99.99。
bind-address
99.99.99.99
可以连接-h localhost但不能连接的原因-h 127.0.0.1是,在第一种形式中,您实际上不是通过TCP / IP连接,而是通过本地套接字连接。
-h localhost
-h 127.0.0.1
在您my.cnf的socket条款中查找。
my.cnf
socket
删除一个冗余bind-address子句。您可能需要使用bind-address=0.0.0.0,它指示MySQL守护程序监听 所有 网络接口。
bind-address=0.0.0.0
2-让我们设置您的SSH隧道
错误的原因对我ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0来说并不明显。我 怀疑 SSH隧道仅在收到连接请求时才建立(在您的情况下,当您运行mysql客户端时)。由于您的服务器不侦听127.0.0.1(请参阅上一段落),因此无法建立SSH隧道,连接失败,并且客户端将其解释为网络故障。
mysql
3-为什么mysql -v -h localhost -P 9989 -u user userdb -p失败
请发布的输出
[编辑:仅在...OR host LIKE 'localhost'下面添加,因为这可能与故障排除有关]
...OR host LIKE 'localhost'
mysql > SELECT user, host FROM mysql.user WHERE user LIKE 'user' OR host LIKE 'localhost';
('user'在LIKE子句后,如有必要,请用实际用户名替换)
'user'
LIKE
MySQL访问控制同时检查用户名/密码(user)和连接源(host),以识别用户。您可能没有创建用户'user'@'localhost'。
user
host
'user'@'localhost'
注意:目前无法从我的位置访问mysql.com,我无法链接到相关的手册页。