Ada*_*dam 15 mysql ssh mac-osx ssh-tunnel
几个月来,我一直通过 SSH 隧道连接到在我们本地测试服务器上运行的 MySQL 实例,没有任何问题。突然之间,我想不出任何变化,服务器开始拒绝来自 Sequel Pro 的登录尝试,并出现以下错误:
无法连接到主机 127.0.0.1,因为访问被拒绝。
仔细检查您的用户名和密码,并确保允许从您当前的位置访问。
MySQL 说:用户 'root'@'localhost' 拒绝访问(使用密码:是)
当通过 SSH 直接连接到服务器时,我可以从终端登录,而不是通过 SSH 隧道。问题并非特定于 Sequel Pro,也不是特定于我自己,我在通过 MySQL Workbench 连接时遇到了与办公室其他人相同的错误。mysqladmin为了理智,我重置了密码,这绝对不是问题。
当我开始深入研究它时,我注意到错误将服务器报告为“localhost”,而不是我在 Sequel Pro 中输入的“127.0.0.1”。一位朋友建议这可能只是错误处理不好,但考虑到 MySQL 中 localhost 和 127.0.0.1 之间的显着差异,这似乎很奇怪。
为了解决隧道问题,我授予了对 root@% 的访问权限,以便我可以直接连接。这在大多数情况下都有效,我可以查看表数据、创建新数据库等。唯一的问题是当我创建用户时出现错误:
用户 'root'@'%' 的访问被拒绝(使用密码:YES)
奇怪的是用户实际上是创建的,我认为这只是授权的问题。尽管如此,从终端我可以在以 root 身份登录时做任何事情。
任何人都可以帮助阐明为什么隧道连接和(可能)grant 命令收到访问被拒绝错误?
作为参考,MySQ 是 5.6.16 版,大部分为默认设置,通过 Homebrew 安装在 MAC OS X 服务器机器上。
更新
以下是当前授予 root 访问权限的主机列表:
mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host | user |
+----------------+------+
| % | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
+----------------+------+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
据我了解,第一行(“%”)真的应该让其他行变得多余吗?
更新 2
修复了授权问题;root@% 用户还没有被授予所有权限,with grant option最后还没有额外的权限,所以除了授予之外,它可以做任何事情。仍然很想知道为什么 SSH 隧道被拒绝。
HBr*_*ijn 21
在 MySQL 中,该localhost关键字是为使用 MySQL 套接字的连接保留的,您应该使用 ip-address127.0.0.1连接到 127.0.0.1 上的 MySQL 网络端口的 TCP 连接。这意味着服务器必须向特定的用户授予权限127.0.0.1,并且客户端必须使用-h 127.0.0.1隧道而不是连接到本地套接字。
要允许您使用 SSH 端口转发进行访问,您需要以下内容:
GRANT SELECT ON *.* TO user@`127.0.0.1`
Run Code Online (Sandbox Code Playgroud)
然后运行
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
并且可能
FLUSH QUERY CACHE;
Run Code Online (Sandbox Code Playgroud)
如果它仍然不起作用,请重新启动服务器进程。
在反向 DNS 查找后的错误消息 127.0.0.1 中被转换为localhost使调试变得困难。
正如手册描述的那样:
在 Unix 上,MySQL 程序特别对待主机名 localhost,与其他基于网络的程序相比,它的方式可能与您期望的不同。对于到 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。即使给出了 -
-port或-P选项来指定端口号,也会发生这种情况。要确保客户端与本地服务器建立 TCP/IP 连接,请使用--host或-h指定主机名值127.0.0.1,或者本地服务器的 IP 地址或名称。您还可以使用该--protocol=TCP选项显式指定连接协议,即使对于本地主机也是如此。例如:
shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP
Run Code Online (Sandbox Code Playgroud)
该
--protocol选项使您能够建立特定类型的连接,即使其他选项通常默认为某些其他协议。