通过SSH隧道连接时,MySQL访问被拒绝错误

几个月来,我一直通过SSH隧道连接到运行在本地testing服务器上的MySQL实例,没有任何问题。 突然之间,没有任何变化,我可以想到,服务器已经开始拒绝来自Sequel Pro的login尝试,错误是:

无法连接到主机127.0.0.1,因为访问被拒绝。

仔细检查您的用户名和密码,并确保您的当前位置的访问是允许的。

MySQL说:拒绝访问用户'root'@'localhost'(使用密码:是)

当通过SSH直接连接到服务器时,我可以通过terminallogin,而不是通过SSH隧道。 这个问题并不是特定于Sequel Pro或者仅仅是我自己,当通过MySQL Workbench连接时,和其他人一样,我也遇到同样的错误。 为了理智,我已经用mysqladmin重置了密码,这绝对不是问题。

当我开始研究它时,我发现错误是将服务器报告为“localhost”,而不是我在Sequel Pro中input的“127.0.0.1”。 一个朋友build议这可能只是错误的处理,但似乎很奇怪,因为本地主机和MySQL中的127.0.0.1之间的显着差异。

为了解决隧道问题,我授予对root @%的访问权限,以便我可以直接连接。 这大部分工作,我可以查看表数据,创build新的数据库等。唯一的问题是,当我来创build用户我得到的错误:

访问拒绝用户“root”@“%”(使用密码:是)

奇怪的是用户实际上是创build的,我认为这只是一个授权问题。 虽然如此,从terminal我可以做任何事情,当以root身份login。

任何人都可以帮助揭示为什么隧道连接和(可能)授予命令正在接收拒绝访问错误?

为了参考,MySQ版本是5.6.16,主要是默认设置,通过MAC OS X Server机器上的Homebrew安装。

更新

以下是根目前被授予访问权限的主机列表:

 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) 

据我了解,第一行(“%”)真的应该使其他人多余?

更新2

修正了授权问题; root @%用户还没有被授予所有的权限,并且在最后with grant option ,所以它可以做所有的事情,只是授予。 但仍然想知道为什么SSH隧道被拒绝。

在MySQL中, localhost关键字被保留为使用MySQL套接字进行连接,您应该使用ip-address 127.0.0.1来连接到127.0.0.1上的MySQLnetworking端口。 这意味着服务器必须从127.0.0.1向用户授予权限,客户端必须使用-h 127.0.0.1才能通过隧道,而不是连接到本地套接字。

要允许您使用SSH端口转发进行访问,您需要如下所示:

 GRANT SELECT ON *.* TO user@`127.0.0.1` 

然后运行

 FLUSH PRIVILEGES; 

并可能

 FLUSH QUERY CACHE; 

如果仍然不起作用,请重新启动服务器进程。

在反向DNS查找转换为localhost之后,出现错误消息127.0.0.1,使debugging变得困难。

正如手册所描述的那样:

在Unix上,MySQL程序专门处理主机名localhost,与其他基于networking的程序相比,这种方式可能与您期望的不同。 对于连接到本地主机,MySQL程序试图通过使用Unix套接字文件连接到本地服务器。 即使给出了-port-P选项来指定端口号,也会发生这种情况。 要确保客户端与本地服务器build立TCP / IP连接,请使用--host-h指定主机名值127.0.0.1 ,或者本地服务器的IP地址或名称。 您也可以通过使用--protocol=TCP选项来显式指定连接协议,即使是本地主机也是如此。 例如:

 shell> mysql --host=127.0.0.1 shell> mysql --protocol=TCP 

--protocol选项使您可以build立特定types的连接,即使其他选项通常默认为其他协议。

我曾经见过ssh tunels,把所有的授予“本地主机”,并授予所有“127.0.0.1”之间的区别,所以尝试授予“127.0.0.1,而不是你的”本地主机“授予。

而不是使用续集来创build隧道,你自己创build的隧道是什么?

ssh -Cc blowfish -Nf -vv -L3306:localhost:3306 sshuser @ domain

然后连接到续集127.0.0.1:3306你可以连接? 有没有什么东西出现在您的terminal(或SSH客户端日志)?