首先让我提一下,我已经看了很多建议的问题,但没有找到相关的答案。这就是我正在做的。

我连接到Amazon EC2实例。我可以用这个命令登录MySQL根目录:

mysql -u root -p

然后我用host %创建了一个新的用户帐单

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

授予用户bill的所有权限:

grant all privileges on *.* to 'bill'@'%' with grant option;

然后我退出root用户,尝试用bill登录:

mysql -u bill -p

输入正确的密码并得到以下错误:

错误1045(28000):用户“账单”@“localhost”(使用密码:YES)的访问被拒绝


当前回答

这可能只适用于少数人,但事实就是这样。不要用感叹号!在你的密码里。

我做到了,并使用MariaDB得到了上述错误。当我把它简化成数字和字母时,它是可行的。其他字符,如@和$工作得很好-我在同一实例的不同用户中使用了这些字符。

这个地址的第五次回复让我找到了解决办法。

其他回答

我也有同样的问题,但在我的情况下,解决方案是由eggyal的评论解决的。我也有一个匿名用户,但删除它并不能解决问题。'FLUSH PRIVILEGES'命令仍然有效。

让我感到惊讶的是,我用MySQL Workbench创建了这个用户,我本来希望它能执行完成任务所需的所有功能。

操作系统:windows

我的错误信息是:

MySQL ERROR 1045(28000):用户'root'@'localhost'(使用密码:YES)被拒绝访问

我的原因是,我没有打开cmd与管理员权限。

所以我的解决方案是作为管理员打开cmd,然后它就工作了。

sudo -i 
mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

访问mysql服务不需要登录(可以看到因为在shell mysql>)

我遇到了同样的错误。失败的设置如下:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

下面编辑的设置是让它工作的一个。注意到区别了吗?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

区别在于双引号。与Java相比,它们在PHP中似乎相当重要,它们在转义字符、设置url以及现在向函数传递参数时都有影响。它们更漂亮(我知道),但总是尽可能多地使用单引号,如果必要的话,可以在其中嵌套双引号。

当我在Linux机器上而不是Windows环境上测试应用程序时,出现了这个错误。

调试总结

检查输入错误:用户名或密码。 检查主机名并与mysql进行比较。用户表主机名。 检查用户是否存在。 检查host中是否包含IP地址或主机名。

在工作中,您很有可能多次遇到这个问题。这个问题发生在我的大多数时候,由于输入错误的用户名或密码。虽然这是其中一个原因,但还有很多其他的机会你可能会遇到这个问题。有时,它看起来非常相似,但当你深入挖掘时,你会发现导致这个错误的多种因素。这篇文章将详细解释大多数常见的原因,并解决这个问题。

可能的原因:

情况1:输入错误:用户名或密码。

这是导致此错误的最常见原因。如果您输入了错误的用户名或密码,您肯定会得到这个错误。

解决方案:

解决这类错误的方法非常简单。只需输入正确的用户名和密码。此错误将被解决。万一你忘记密码,你可以重置用户名/密码。 如果您忘记了admin / root帐户的密码,有许多方法可以重置/重新获取root密码。我将发布另一篇关于如何重置根密码,如果你忘记根密码。

案例2:从错误的主机访问。

MySQL提供了基于主机的用户访问限制作为安全特性。在我们的生产环境中,我们习惯于将访问请求限制为应用程序服务器。这个特性在许多生产场景中非常有用。

解决方案:

When you face this type of issue, first check whether your host is allowed or not by checking the mysql.user table. If it is not defined, you can update or insert new record to mysql.user table. Generally, accessing as a root user from remote machine is disabled and it is not a best practice, because of security concerns. If you have requirements to access your server from multiple machines, give access only to those machines. It is better not to use wildcards (%) and gives universal accesses. Let me update the mysql.user table, now the demouser can access MySQL server from any host.

情况3:服务器上不存在用户。

当您试图访问的用户在MySQL服务器上不存在时,就会发生这种类型的错误。

解决方案:

当你遇到这种类型的问题,只要检查用户是否存在于mysql。用户表。如果记录不存在,则用户无法访问。如果要求该用户访问,则使用该用户名创建一个新用户。

案例4:混合使用基于数字和名称的主机。

重要的几点

在定义用户主机时不建议使用通配符,尽量使用确切的主机名。 从远程机器禁用root登录。 使用代理用户概念。

与此主题相关的其他概念很少,详细讨论这些主题是本文的不同范围。我们将在接下来的文章中研究以下相关主题。

如果你忘记了MySQL服务器的root密码,该怎么办? MySQL访问权限问题和用户相关的表。 具有最佳实践的MySQL安全特性。

我希望这篇文章将帮助你修复MySQL错误代码1045拒绝用户访问MySQL。