启用远程MySQL连接:错误1045(28000):用户被拒绝访问


136

在Windows XP上运行的MySQL 5.1.31。

本地 MySQL服务器(192.168.233.142),我可以以root用户身份进行如下连接:

>mysql --host=192.168.233.142 --user=root --password=redacted

远程计算机(192.168.233.163),我可以看到mysql端口已打开:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

但是,当尝试从远程计算机连接到mysql时,我收到:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

我在mysql.user中只有2个条目:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

我还需要做些什么来启用远程访问?

编辑

正如下面Paulo所建议的那样,我尝试用IP特定条目替换%的mysql.user条目,因此我的用户表现在如下所示:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

然后,我重新启动了计算机,但问题仍然存在。

Answers:


211

您必须将此作为根:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

其中IP是您要允许访问的IP,USERNAME是您用于连接的用户,而PASSWORD是相关的密码。

如果您想允许从任何IP访问%而不是IP

然后你只需要把

FLUSH PRIVILEGES;

或重新启动mysql服务器,仅此而已。


没有本地mysql客户端,有没有办法做到这一点?
cmcginty 2013年

如何删除特定IP的特权?
2014年

4
stackoverflow.com/a/21151255/470749也对我有帮助,因为我想我的绑定地址设置需要注释掉。授予远程特权不足以使其正常工作。
瑞安

8
答案中没有解释,而是PASSWORD用帐户密码代替。我只尝试了上述更改USERNAMEIP并且直到我更改后它才对我有用PASSWORD
理查德·帕纳比·金

完成此操作后,请按照以下答案中的说明进行操作: stackoverflow.com/a/21151255/445438
budhajeewa 2015年

85

授予远程访问权限后,我一直遇到相同的错误,直到执行以下操作:

/etc/mysql/my.cnf

在较新版本的mysql中,文件的位置为 /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(注释此行:bind-address = 127.0.0.1

然后运行service mysql restart


6
或者,将其更改为bind-address = 0.0.0.0
lolski 2014年

2
只注释掉bind-address对我不起作用。无论是bind-address = 0.0.0.0bind-address = <server_ip>作品。
chantyal '16

58

默认情况下,在MySQL服务器中,远程访问处于禁用状态。提供对用户的远程访问的过程是。

  1. 转到我的sql bin文件夹或将其添加到 PATH
  2. 登录到root用户mysql -uroot -proot(或使用任何root密码)。
  3. 成功的话,你会得到 mysql>
  4. 为该用户提供全部授予访问权限。

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

如果我们将%任何IP地址设置为可以远程访问,则此处的IP是您要允许对其进行远程访问的IP地址。

例:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

这对于其他用户。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

希望这会有所帮助


+1代表出色的细节,它确实帮助我看到了这0 rows affected是一种常态:)另外,service mysqld restart建议在最后。[ mysqld有时只是mysql]
Nathan Dortman 2014年

#注意:对于5.6+版本,请使用“ grant all on ...”(无特权)
Nicke Manarin 2014年

21

Paulo的帮助使我找到了解决方案。它是以下各项的组合:

  • 密码包含美元符号
  • 我试图从Linux Shell连接

bash外壳将美元符号视为扩展为环境变量的特殊字符,因此我们需要使用反斜杠对其进行转义。顺便说一句,在美元符号是密码的最后一个字符的情况下,我们不必这样做

例如,如果您的密码是“ pas $ word”,那么在Linux bash中,我们必须进行如下连接:

# mysql --host=192.168.233.142 --user=root --password=pas\$word

4
除上述内容外,请检查/etc/mysql/my.cnf并注释bind-address = 127.0.0.1
Buminda 2014年

2
另外,也可以使用单引号防止$的扩展:mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb

密码中的“ $”。无价。万分感谢 !!
Nagendra Kakarla,

在将我的头对着显示器拍打一会儿之后,我遇到了这个问题,并且效果很好。我曾有一个 !和@作为我的密码。更改了密码,刷新了特权,我又回来了。谢谢!
AJM

9

你有防火墙吗?确保端口3306已打开。

在Windows上,默认情况下会创建mysql根帐户,该帐户仅允许从本地主机访问,除非您选择了在安装过程中启用从远程计算机进行访问的选项。

以'%'作为主机名创建或更新所需的用户。

例如:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';

6
服务器答复“错误1045(28000):拒绝访问” ...如果防火墙阻止将超时...
Paulo

只是想先发表。我的坏人
Vamsi Krishna B

@Krish-问题中已经涵盖了您建议的所有内容
Mike Chamberlain

5
  1. 再试flush privileges一次。

  2. 尝试重新启动服务器以重新加载授权。

  3. 尝试创建一个主机为“ 192.168.233.163”的用户。“%”似乎不允许全部(很奇怪)


谢谢,我尝试了一下,但无济于事。我用您的建议更新了问题。
Mike Chamberlain

4
尝试创建另一个用户,并且不要忘记设置所有授予:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.

4

就我而言,我试图连接到cent OS上的远程mysql服务器。经过许多解决方案(授予所有特权,删除ip绑定,启用网络连接)之后,问题仍然没有得到解决。

事实证明,在研究各种解决方案时,我遇到了iptables,这使我意识到mysql端口3306不接受连接。

这是有关我如何检查和解决此问题的小注释。

  • 检查端口是否接受连接:

    telnet(mysql服务器ip)[portNo]

  • 添加ip表规则以允许端口上的连接:

    iptables -A输入-i eth0 -p tcp -m tcp --dport 3306 -j接受

  • 不建议在生产环境中使用此功能,但是如果您的iptables配置不正确,则添加规则可能仍无法解决问题。在这种情况下,应执行以下操作:

    服务iptables停止

希望这可以帮助。


3

如果您使用的是动态IP,则只需授予对192.168.2。%的访问权限,那么现在您不必担心每次都授予对IP地址的访问权限了。


1

我在为Amazon EC2 Linux实例远程登录MYSQL时遇到了麻烦。发现解决方案是确保我的安全组包括MySQL端口3306的入站规则,以包括我的IP地址(或任何位置都为0.0.0.0/0)。添加此规则后,立即可以远程连接。


1

mysql配置文件的新位置是

/etc/mysql/mysql.conf.d/mysqld.cnf


0

用户/主机组合可能是在没有密码的情况下创建的。

我以为在为现有用户添加新主机(使用GUI应用程序)时,现有密码也将用于新用户/主机组合。

我可以登录

mysql -u username -p PASSWORD

本地,但不是来自IPADDRESS

mysql -u --host=HOST -p PASSWORD

(我实际上可以不使用密码从IPADDRESS登录)

mysql -u --host=HOST

设置密码允许访问:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';

1
谢谢,我花了很多时间尝试远程连接到Mysql服务器,这条线很有帮助。设置用户密码时,出现了ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number导致我出现此错误的错误:Knowmysql.blogspot.com/2013/09/…完成这些步骤之后,我终于可以连接到服务器了。
Andy Forceno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.