场景 #1

场景 #1

我已经在我的机器上设置了 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 也是如此。

相关内容