MySQL ERROR 1045 (28000): Access denied for user 'bill'@'(使用密码:YES)

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

我连接到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)的访问被拒绝

1642180 次浏览
好吧,我不确定,但可能是mysql安装目录中的my.cnf文件是罪魁祸首。

.注释掉这一行,问题可能就解决了
bind-address = 127.0.0.1

当你输入mysql -u root -p时,你是在通过本地unix套接字连接到mysql服务器。

不管你给的授权是什么,'bill'@'%'只匹配TCP/IP连接。

如果你想要授予对本地unix套接字的访问权限,你需要授予'bill'@'localhost'权限,奇怪的是,这与'bill'@'127.0.0.1'不一样。

你也可以使用TCP/IP连接mysql命令行客户端,以匹配你已经授予的权限,例如运行mysql -u root -p -h 192.168.1.123或任何本地IP地址你的盒子。

当你逃离

mysql -u bill -p

得到了这个错误

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld期望你作为bill@localhost连接

尝试创建bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

如果要远程连接,必须指定DNS名称、公共IP或127.0.0.1,使用TCP/IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

登录后,请运行这个

SELECT USER(),CURRENT_USER();

用户()报告你如何尝试在MySQL中验证

CURRENT_USER ()报告如何从mysql.user表中被允许在MySQL中进行身份验证

这将使您更好地了解如何以及为什么允许您登录mysql。为什么知道这个观点很重要?它与用户身份验证排序协议有关。

下面是一个例子:我将在我的桌面MySQL上创建一个匿名用户

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)


mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)


mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)


mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)


mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)


mysql>

好吧,看我以匿名用户登录:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)


Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)


mysql>

认证顺序非常严格。它从最具体的到最不具体的。我在DBA StackExchange中写过这种身份验证风格

不要忘记在必要时显式地调用TCP作为mysql客户端的协议。

你可能有一个匿名用户''@'localhost'''@'127.0.0.1'

根据手动:

当可能有多个匹配时,服务器必须确定 使用它们。解决方法如下:(…)

  • 当客户端尝试连接时,服务器会按顺序检查[mysql.user表]行。
  • 服务器使用与客户端主机名和用户名匹配的第一行。
< p >(…) 服务器使用排序规则对首先是最特定的Host值进行排序。 字面主机名[如'localhost']和IP地址是最具体的

因此,这样的匿名用户将“掩盖”;当从localhost连接时,任何其他用户,如'[any_username]'@'%'

'bill'@'localhost'确实匹配'bill'@'%',但会预先匹配(例如)''@'localhost'

推荐的解决方案是删除这个匿名用户(这通常是一件好事)。


下面的编辑大多与主要问题无关。这些只是为了回答本帖其他评论中提出的一些问题。

编辑1

通过套接字验证为'bill'@'%'



root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
Welcome to the MySQL monitor (...)
    

mysql> SELECT user, host FROM mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| bill | %         |
| root | 127.0.0.1 |
| root | ::1       |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
    

mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | bill@%         |
+----------------+----------------+
1 row in set (0.02 sec)
    

mysql> SHOW VARIABLES LIKE 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | ON    |
+-----------------+-------+
1 row in set (0.00 sec)
    

编辑2

完全相同的设置,除了我重新激活了网络,现在我创建了一个匿名用户''@'localhost'



root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Welcome to the MySQL monitor (...)
    

mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
Query OK, 0 rows affected (0.00 sec)
    

mysql> Bye


root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket=/tmp/mysql-5.5.sock
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)


编辑3

与编辑2中的情况相同,现在提供匿名用户的密码。



root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Welcome to the MySQL monitor (...)


mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | @localhost     |
+----------------+----------------+
1 row in set (0.01 sec)


来自编辑1的结论1:可以通过套接字验证为__abc0。

来自编辑2的结论2:通过TCP还是通过套接字连接对身份验证过程没有影响(除非一个人不能通过套接字以'something'@'localhost'的身份连接,显然)。

来自编辑3的结论3:尽管我指定了-ubill,但我已被授予匿名用户的访问权限。这是因为“排序规则”;上面的建议。注意,在大多数默认安装中,存在无密码匿名用户(并且应该被保护/删除)。

MySQL帐户名称由用户名和主机名组成,主机名中的“localhost”表示本地主机。主机名或IP地址值中可以使用通配符“%”和“_”。这些与使用LIKE操作符执行的模式匹配操作具有相同的含义。例如,'%'的主机值匹配任何主机名,而'%.mysql.com'的值匹配mysql.com域中的任何主机。“192.168.1。%'匹配192.168.1类C网络中的任何主机。

以上只是介绍:

实际上用户'bill'@'localhost''bill'@'%'是不同的MySQL帐户,因此两者都应该使用自己的身份验证细节,如密码。

有关更多信息,请参阅http://dev.mysql.com/doc/refman//5.5/en/account-names.html

解决方案是删除匿名(Any)用户!

我在别人设置的服务器上也遇到了同样的问题。我通常不选择在安装MySQL时创建一个匿名用户,所以没有注意到这一点。最初,我以“root”用户登录,并创建了几个“正常”用户(也就是仅在dbs上以用户名作为前缀的用户),然后注销,然后继续验证第一个正常用户。我无法登录。既不通过phpMyAdmin,也不通过shell。事实证明,罪魁祸首是这个“任意”用户。

试一试:

~$ mysql -u root -p
Enter Password:


mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

我希望你在mysql中删除debian-sys- maintenance用户没有造成更大的损害

让你的mysql守护进程正常运行。启动mysql客户端,如下所示

mysql -u debian-sys-maint -p

在另一个终端,cat文件/etc/mysql/debian.cnf。该文件包含密码;当提示输入密码时,粘贴该密码。

http://ubuntuforums.org/showthread.php?t=1836919

当你运行mysql -u bill -p时,localhost被解析为你的ip,因为它是127.0.0.1,并且在你的/etc/hosts文件中,默认存在127.0.0.1 localhost。因此,mysql将你解释为bill@localhost,而不是bill@'%'。这就是为什么在select host, user from mysql.user;查询的结果中有2个不同的root用户记录。

有两种方法可以处理这个问题。

一个是指定一个ip,当你尝试登录时,它不是由/etc/hosts文件反向解析的。例如,服务器的ip为10.0.0.2。当您运行命令mysql -u bill -p -h 10.0.0.2时,您将能够登录。如果你输入select user();,你会得到bill@10.0.0.2。当然,在你的/etc/hosts文件中,任何域名都不应该解析为这个ip。

其次,您需要授予该特定域名的访问权限。对于bill@localhost,你应该调用命令grant all privileges on *.* to bill@localhost identified by 'billpass';。在这种情况下,您将能够使用命令mysql -u bill -p登录。一旦登录,select user();命令返回bill@localhost

但这仅适用于您尝试登录同一主机上的mysql服务器。从远程主机,mysql的行为是预期的,'%'将授予您登录。

确保没有其他正在运行的SQL实例正在使用本地主机帖子。在我们的例子中,本地主机上运行的另一个实例与登录冲突。把它关掉就解决了这个问题。

我通过删除旧的错误用户“账单”条目来解决这个问题(这是重要的部分:都来自mysql.usermysql.db),然后创建与前面相同的用户:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

工作完毕,用户正在连接。现在我将删除一些特权从它:)

如果您使用旧版本的MySQL UI(如SQLYoug),生成的密码带有错误的散列,也会出现这个问题。

用SQL脚本创建用户可以解决这个问题。

省得你自己头疼……您的问题可能是口令周围没有引号。至少我的案子绕了我三个小时。

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

搜索“这是一个典型的用户选项文件:”,看看他们在那里陈述的例子。祝你好运,我希望能为别人节省一些时间。

在我的案例中,一个相关的问题是试图连接使用:

mysql -u mike -p mypass

空格显然是允许在-u #uname#之间,但在-p和#password#之间

因此需要:

mysql -u mike -pmypass

否则,在-p mypass之间有空格,mysql将'mypass'作为db的名称

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

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

我为自己找到的最好的解决办法是。

我的用户是声纳,每当我试图从外部或其他机器连接到我的数据库,我得到错误

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

此外,我正在尝试从另一台机器和通过詹金斯工作我的URL访问是

alm-lt-test.xyz.com

如果你想远程连接,你可以用以下不同的方式指定它:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

要访问这个URL,你只需要执行以下查询。

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

只是想让你知道一个不寻常的情况下,我收到了同样的错误。也许这在将来会对某些人有所帮助。

我开发了一些基本视图,在开发站点创建,并将它们转移到生产站点。那周晚些时候,我修改了一个PHP脚本,突然出现了一个错误,用户“local-web-user”@“localhost”的访问被拒绝。数据源对象没有改变,所以我把注意力集中在MySQL中的数据库用户上,同时担心有人入侵我的网站。幸运的是,遗址的其他部分似乎没有受到损害。

后来证明,这些观点才是罪魁祸首。我们的对象传输是使用本地网站用户以外的另一个用户(并且是远程:admin@ip-address)完成的。因此,视图是用'admin'@'ip-address'作为定义符创建的。视图创建SECURITY default为

SQL SECURITY DEFINER

当local-web-user试图使用视图时,它会偶然发现定义者缺乏使用表的特权。一旦安全性更改为:

SQL SECURITY INVOKER

问题解决了。实际问题与基于错误消息的预期完全不同。

这是以下两者之间的区别:

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

而且

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

检查:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

命令

mysql -u bill -p

隐式访问'bill'@'localhost',而不是'bill'@'%'。

“bill”@“localhost”没有权限

你会得到错误:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

解决问题:

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


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

对于Mac用户,如果他们仍然有问题(就像我的情况),我发现这个解决方案对我有效:MySQL命令行“-bash命令未找到”

要在macbook终端上使用命令,即mysql,你需要使用以下命令导出路径:

export PATH=$PATH:/usr/local/mysql/bin/

考虑默认安装,以root用户使用以下命令获取mysql提示符:

mysql -u root

否则您使用了错误的根密码。

参考:在OSX上设置MySQL root用户密码

不确定其他人是否会发现这有帮助,但我遇到了同样的错误,并搜索任何匿名用户…但实际上并没有。问题最终是用户帐户被设置为“要求SSL”-这是我在PHPMyAdmin通过进入用户帐户并单击编辑用户的权限发现的。只要我取消了这个选项,一切都按预期工作!

如果您忘记密码或想修改密码。你可以遵循以下步骤:

1:停止mysql

[root@maomao ~]# service mysqld stop
停止MySQL: [OK]

2:使用“——skip-grant-tables”重启mysql

[root@mcy400 ~]# mysqld_safe——skip-grant-tables
[root@cy400 ~]#从/var/lib/mysql启动mysqld守护进程

3:新建一个窗口,输入mysql -u root

[root@cy400 ~]# mysql -u root
欢迎来到MySQL监视器。命令以;或\ g . < / p >

4:修改用户数据库

mysql>使用mysql
读取表信息以完成表和列名 您可以关闭此功能以使用-A更快地启动 数据库修改< / p >

5:修改你的密码你的新密码应该输入在“()”

mysql> update user set password=password('root123') where user='root';< br > 查询OK, 3行影响(0.00秒)
行匹配:3更改:3警告:0

6:冲水

Mysql >刷新权限;

7:戒烟

mysql> quit
再见< / p >

8:重启mysql

[root@cy400 ~]# service mysqld restart;< br > 停止MySQL: [OK]
启动MySQL: [OK]

宾果!你可以用用户名和新密码连接你的数据库:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
当你的密码包含一些特殊字符,如@,$等,也会发生这种情况。 为了避免这种情况,你可以将password用单引号括起来:

$ mysql -usomeuser -p's0mep@$$w0Rd'

或者在输入时不用密码。请留空,然后在终端要求时输入。这是推荐的方法。

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)


Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql>

百分号表示所有ip,所以localhost是多余的…本地主机不需要第二条记录。

实际上有,'localhost'在mysql中是特殊的,它意味着通过unix套接字(或windows上的命名管道)连接,而不是TCP/IP套接字。使用%作为主机不包括'localhost'

MySQL用户帐户有两个组成部分:用户名和主机名。用户名标识用户,主机名指定用户可以从哪些主机连接。用户名和主机名的组合:

< p > '<user_name>'@'<host_name>' 您可以为主机名指定特定的IP地址或地址范围,或者使用百分比字符(“%”)使该用户能够从任何主机登录。< / p >

注意,用户帐户是由用户名和主机名同时定义的。例如,'root'@'%''root'@'localhost'是不同的用户帐户。

对我来说,这个问题是由MySQL 5.7.2的一个新特性引起的:如果user项的plugin字段为空,则它们是忽略了

将其设置为e.g. mysql_native_password以重新启用它们:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

参见«Authentication Notes»下的MySQL 5.7.2的发布说明

出于某种原因(可能是因为我在4.1之前的密码散列被删除了),mysql_upgrade脚本没有设置默认的插件值。

我通过注意/var/log/mysql/error.log中的以下警告消息发现了这一点:

[警告]用户条目“foo”@“%”的插件值为空。该用户将被忽略,任何人都不能再使用该用户登录。

我把这个答案贴在这里,也许是为了让别人不用像我一样花那么多荒谬的时间来研究这个问题。

这太迟了

我尝试了所有这些其他答案,并运行了许多不同版本的mysql -u root -p,但从未运行过


mysql -u root -p

只要按[ENTER]就可以得到密码。


一旦我这么做了,就成功了。希望这能帮助到一些人。

调试总结

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

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

可能的原因:

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

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

解决方案:

解决这类错误的方法非常简单。只需输入正确的用户名和密码。此错误将被解决。万一你忘记密码,你可以重置用户名/密码。 如果您忘记了admin / root帐户的密码,有许多方法可以重置/重新获取root密码。我将发布另一篇关于如何在忘记根密码的情况下重置根密码的文章
  • 案例2:从错误的主机访问。

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

解决方案:

当你遇到这种类型的问题时,首先检查你的主机是否被允许,通过检查mysql。用户表。 如果没有定义,您可以更新或插入新的记录到mysql。用户表。 一般来说,从远程机器以根用户访问是禁用的,出于安全考虑,这不是最佳实践。 如果需要从多台机器访问服务器,请只允许这些机器访问。最好不要使用通配符(%),并提供通用访问。 我来更新mysql。

. user表,现在解除用户可以从任何主机访问MySQL服务器
  • 情况3:服务器上不存在用户。

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

解决方案:

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

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

重要的几点

  • 在定义用户主机时不建议使用通配符,尽量使用确切的主机名。

  • 从远程机器禁用root登录。

  • 使用代理用户概念。

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

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

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

在Windows上,解决方法如下:

错误1045(28000):拒绝访问用户'root'@'localhost'(使用密码:NO)

  1. 从控制面板卸载mysql
  2. 删除C:\Program Files,C:\Program Files (x86)C:\ProgramData中的MySql文件夹
  3. 安装mysql

我有一个有点类似的问题-在我第一次尝试进入MySQL,作为root,它告诉我访问被拒绝。原来我忘记使用sudo

因此,如果你第一次尝试root失败,请尝试:

sudo mysql -u root -p

然后输入密码,就可以了。

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

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环境上测试应用程序时,出现了这个错误。

操作系统:windows

我的错误信息是:

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

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

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

我发现了另一种情况,表面上看是一种边缘情况;我可以导出到文件系统,通过SELECT INTO ..OUTFILE为根用户,而不是普通用户。虽然这可能是权限的问题,但我已经看过了,并没有看到特别明显的东西。我只能说,作为对所讨论的数据库具有所有权限的普通用户执行查询,将返回导致我讨论此主题的访问拒绝错误。当我发现在一个旧项目中成功使用SELECT INTO…OUTFILE的记录时,我注意到我是以根用户登录的。果然,当我以root身份登录时,查询按预期运行。

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

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

这个地址的第五个响应引导我解决问题。

如果MySQL运行在不区分大小写的操作系统(如Windows)上,也可能发生这种情况。

例:我发现尝试使用这些凭据连接到数据库失败:

mysql > grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

错误1045(28000):拒绝访问用户'specialuser'@'10.0.1.113'(使用密码:YES)

但是,这成功了:

mysql > grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

输入密码:

在v8.0.15(可能是这个版本)上,PASSWORD()函数不起作用。

你必须:

  1. 确保你已经停止MySQL。
  2. 以特权绕过的安全模式运行服务器:sudo mysqld_safe --skip-grant-tables
  3. 登录:mysql -u root
  4. mysql > UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql > FLUSH PRIVILEGES;
  6. mysql > exit;
  7. 再次登录:mysql -u root
  8. mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

我有类似的问题,因为我的密码包含“;”字符破坏我的密码时,我第一次创建它。如果对你有帮助,请谨慎使用。

如果你的dbname、用户名、密码等字符串长度超过https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html#grant-tables-scope-column-properties中列出的值,你也可能无法登录,就像我的情况一样。

现在!解决方案:

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

Wampserver 3.2.0新的安装或升级

可能xamp使用mariaDB作为默认值是很好的。

Wamp服务器自带mariaDB和mysql,默认在3306端口安装mariaDB,在3307端口安装mysql,端口有时是3308。

连接到mysql!

在安装时,它要求使用mariaDBMySql,但mariaDB被选中为默认值,你不能更改它,检查mysql选项并安装。

安装完成后,两者都将在默认端口3306上运行mariaDB,在另一个端口3307或3308上运行mysql

右键单击wampserver图标,它的运行应该在右下角,转到工具,并看到正确的mysql运行端口。

并将其包含在数据库连接中,如下所示:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port


$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note :我正在使用pdo。

更多信息请参见这里:https://sourceforge.net/projects/wampserver/

对我来说,root有一个默认密码

我用ALTER USER 'root'@'localhost' IDENTIFIED BY 'new Password';修改了密码,它工作了

对我来说,它在进入mysql时没有指定-p参数。

mysql -p

我没有问题,但它是错误的调用mysql没有密码。

所以对我来说,这个问题与我映射的端口有关。

3306 =比;3306不工作(因为我有一个本地mysql运行)

3307 =比;3306件!

这是在建立ssh隧道的上下文中:

ssh -N -L 3307:rdsDns:3306 ec2User@ec2Dns -i key.pem -v

3307为本端端口,3306为远端端口。

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

在不登录的情况下访问mysql服务(可以看到因为在shell mysql>)

在我的情况下,服务器托管我的代码是发送'@blablabla.amazonaws.com'在用户名的ed时,试图登录MySQL。所以我不得不将%.amazonws.com添加到我的主机的用户配置(dreamhost)中,它通过了