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

150

我正在使用运行在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所建议的,我尝试将mysql.user中%的条目替换为特定IP的条目,因此我的用户表现在看起来像这样:

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

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

13个回答

224

您需要将此放置在根目录下:

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

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

如果您想允许来自任何IP的访问,只需将%放在IP的位置即可。

然后您只需要输入

FLUSH PRIVILEGES;

或者重新启动MySQL服务器,就可以了。


有没有不使用本地mysql客户端的方法来完成这个任务? - cmcginty
如何取消特定IP的权限? - Umair Ayub
5
https://dev59.com/n2sy5IYBdhLWcg3wsQFj#21151255 对我也有帮助,因为我猜测我的 bind-address 设置需要被注释掉。授予远程权限还不足以使它工作。 - Ryan
9
我尝试了上述方法,只更改了“用户名”和“IP”,但在我更改了“密码”之后才成功。请注意,在答案中不做解释,但请将“PASSWORD”替换为帐户密码。 - Richard Parnaby-King
1
你还可以使用%来通配IP。例如:GRANT ALL PRIVILEGES ON . TO 'USERNAME' @ '10.1.1.%' IDENTIFIED BY 'PASSWORD' with grant option; - Xebozone
显示剩余5条评论

94

在允许远程访问之后,我一直遇到同样的错误,直到我做了以下更改:

/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


8
可以将其更改为bind-address = 0.0.0.0,意思是将其绑定到所有可用的网络接口上。请注意,这里只进行翻译,不提供任何解释或其他信息。 - lolski
3
仅注释掉“bind-address”对我没有起作用。使用“bind-address = 0.0.0.0”或“bind-address = <server_ip>”都可以。 - chhantyal

60

在MySQL服务器中,远程访问默认是被禁用的。允许用户进行远程访问的过程如下:

  1. 进入MySQL bin文件夹或将其添加到PATH路径中。
  2. 通过mysql -uroot -proot(或者使用root密码)登录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行受影响”是正常的 :) 此外,建议在最后执行service mysqld restart [mysqld有时只是mysql]。 - Nathan Dortman
#注意:对于版本5.6+,请使用“grant all on...”(不包括权限) - Nicke Manarin

22

保罗的帮助带领我找到了解决方案。这是以下几个因素的结合:

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

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

例如,如果您的密码是"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
2
另外,您可以使用单引号来防止$的扩展:mysql --host=192.168.233.142 --user=root --password='pas$word'。参考自https://dev59.com/Smw15IYBdhLWcg3wT5_2#6697781。 - jalanb
密码中的'$'是无价之宝。非常感谢! - Nagendra Kakarla
在我苦思冥想了一段时间后,我找到了这个方法并且它奏效了。我的密码中包含有"!"和"@"符号。我更改了密码,刷新了权限,现在我又可以继续工作了。谢谢! - AJM
你为什么要在命令行上输入密码?这简直太疯狂了。你应该考虑使用my.cnf文件进行配置。 - dland

9

你是否有防火墙?请确保 3306 端口已经打开。

在 Windows 上,默认情况下 mysql root 账户只允许从本地主机访问,除非在安装过程中选择启用远程访问选项。

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

例如:

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

6
服务器回复“ERROR 1045 (28000):拒绝访问”...如果防火墙被阻止,将会超时... - Paulo H.
我只是想先发布一下。我的错。 - Vamsi Krishna B
@Krish - 你提出的所有建议都已经在问题中涵盖了。 - Mike Chamberlain

7
  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.
1
今天我遇到了一个情况,'user'@'%'确实没有授予'user'从任何主机远程访问的权限,而是只定义了特定的主机IP。经过进一步测试,我发现这是因为我将SQL服务器绑定到了"0.0.0.0"。当我完全注释掉服务器配置中的绑定地址后,突然一切都按预期工作了。确实不太直观。 - undefined

4
在我的情况下,我正在尝试连接到CentOS上的远程MySQL服务器。经过了很多解决方案(授予所有权限、删除IP绑定、启用网络),问题仍然没有得到解决。
事实证明,在研究各种解决方案时,我发现了iptables,这使我意识到MySQL端口3306没有接受连接。
以下是我如何检查和解决此问题的小提示:
- 检查端口是否接受连接: telnet(mysql服务器IP)[端口号] - 添加允许端口连接的ip表规则: iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT - 不建议在生产环境中使用此方法,但如果您的iptables未正确配置,则添加规则可能仍无法解决问题。在这种情况下,应执行以下操作: service iptables stop 希望这能有所帮助。

3
如果您使用的是动态IP,请授予192.168.2.%访问权限,这样您就不必每次都担心授予IP地址访问权限了。

1

MySQL ODBC 3.51驱动程序的问题是无法处理密码中的特殊字符。

"警告 - 如果您在GRANT命令中的密码包含特殊字符,例如!@#$%^?,则可能会遇到MySQL ODBC 3.51的严重问题。 MySQL ODBC 3.51 ODBC驱动程序不支持密码框中的这些特殊字符。您将收到的唯一错误消息是“Access denied”(使用密码:YES)" - 来自http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/


1
我曾经遇到了远程登录Amazon EC2 Linux实例中的MYSQL的问题。后来发现解决方法是确保我的安全组包含一个针对MySQL端口3306的入站规则,并将我的IP地址(或0.0.0.0/0表示任何地方)添加到该规则中。一旦我添加了这个规则,我立即就能够远程连接了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接