几个月来,我一直通过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客户端日志)?