我已经在我的机器上设置了 MySQL 端口转发,如下所示:
ssh -f -N -L :9906:localhost:3306 <ssh login>
现在,如果我尝试从本地主机连接到 MySQL,如下所示:
mysql -u<user> -p<password> -P9906 -h127.0.0.1 <schema>
一切正常。但是,如果我-
从本地取出 h 参数,即,如果我从 localhost 连接到 MySQL,如下所示:
mysql -u<user> -p<password> -P9906 <schema>
我收到以下错误:
错误 1045 (28000):拒绝用户 ''@'localhost' 访问(使用密码:是)
为什么会有这种行为?
我尝试为 localhost 和 127.0.0.1 设置端口转发,但错误仍然存在。
此外,在服务器上,已授予用户 localhost 和 127.0.0.1 的权限。
答案1
有四 (4) 个场景需要注意
场景 #1
当您指定时,-P<port number>
您必须使用 TCP/IP。因此,-h<IPAddress>
可以工作。
场景 #2
当您指定-P<port number>
不带时-h<IPAddress>
,localhost
则假定。在这种情况下,不使用 TCP/IP,而是使用 mysql 套接字文件进行身份验证。
场景 #3
当您指定-h127.0.0.1
不带时-P<port number>
,localhost
则假定。在这种情况下,不使用 TCP/IP,而是使用 mysql 套接字文件进行身份验证。
场景 #4
当您指定 时-h127.0.0.1
,-P<port number>
则不localhost
假定。将使用 TCP/IP,但必须正确定义用户。
给出错误信息:
错误 1045 (28000):拒绝用户 ''@'localhost' 访问(使用密码:是)
以及你尝试登录的方式
mysql -u -p -P9906 -h127.0.0.1
你进入了场景 #4
建议
在mysql.user
,确保您有
user@localhost
(好的)[email protected]
, (好的)user@%
(不推荐但可以做)
使用相同的密码(如果需要,也可以使用不同的密码)
一旦您成功登录,运行此查询
SELECT USER(),CURRENT_USER();
用户()报告您如何在 MySQL 中进行身份验证
当前用户()报告您被允许在 MySQL 中进行身份验证的方式
添加正确的用户可让您正确验证身份。您的目标应该是以mysql.user
这样的方式设置用户USER()
,并CURRENT_USER()
具有相同的输出或至少尽可能特定于主机。
答案2
如果未指定主机名(或者使用 指定了 localhost 主机名-hlocalhost
,即使您指定了端口),MySQL 客户端也会连接到套接字文件。因此,当您尝试使用 连接到远程数据库时mysql -u -p -P9906
,您实际上是在尝试访问本地 MySQL 服务器实例。输入后SHOW DATABASES
,将打印您的本地数据库列表。
因此,要通过端口转发访问远程实例,您必须指定主机(127.0.0.1)以避免连接到套接字文件。
这是MySQL 文档:
在 Unix 上,MySQL 程序会特殊处理主机名 localhost,与其他基于网络的程序相比,这种方式可能与您预期的不同。对于与 localhost 的连接,MySQL 程序会尝试使用 Unix 套接字文件连接到本地服务器。即使使用 --port 或 -P 选项指定端口号,也会发生这种情况。要确保客户端与本地服务器建立 TCP/IP 连接,请使用 --host 或 -h 指定主机名值 127.0.0.1,或本地服务器的 IP 地址或名称。您还可以使用 --protocol=TCP 选项明确指定连接协议,即使对于 localhost 也是如此。