493

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

我已连接到我的 Amazon EC2 实例。我可以使用以下命令使用 MySQL root 登录:

mysql -u root -p

然后我用主机 % 创建了一个新的用户账单

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

授予用户账单的所有权限:

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

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

mysql -u bill -p

输入正确的密码并收到此错误:

错误 1045 (28000):拒绝用户 'bill'@'localhost' 的访问(使用密码:是)

4

40 回答 40

473

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

根据手册

当可能有多个匹配时,服务器必须确定使用哪一个。它解决了这个问题如下:(...)

  • 当客户端尝试连接时,服务器会按排序顺序查看[表 mysql.user]的行。
  • 服务器使用与客户端主机名和用户名匹配的第一行。

(...) 服务器使用排序规则,首先对具有最具体 Host 值的行进行排序。文字主机名[例如 'localhost']和 IP 地址是最具体的。

因此,这样的匿名用户会“屏蔽”任何其他用户,例如'[any_username]'@'%'localhost.

'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
    欢迎使用 MySQL 监视器 (...)

    mysql> 选择用户,主机 FROM mysql.user;
    +--------+------------+
    | 用户 | 主持人 |
    +--------+------------+
    | 账单 | % |
    | 根 | 127.0.0.1 |
    | 根 | ::1 |
    | 根 | 本地主机 |
    +--------+------------+
    4 行一组(0.00 秒)

    mysql> 选择用户(),当前用户();
    +----------------+----------------+
    | 用户() | 当前用户() |
    +----------------+----------------+
    | 账单@localhost | 账单@% |
    +----------------+----------------+
    一组中的 1 行(0.02 秒)

    mysql> 显示变量,如“skip_networking”;
    +-----------------+--------+
    | 变量名 | 价值 |
    +-----------------+--------+
    | 跳过网络 | 开 |
    +-----------------+--------+
    一组中的 1 行(0.00 秒)

编辑 2

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

    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    欢迎使用 MySQL 监视器 (...)

    mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
    查询正常,0 行受影响(0.00 秒)

    mysql>再见

    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket=/tmp/mysql-5.5.sock
    错误 1045 (28000):拒绝用户 'bill'@'localhost' 的访问(使用密码:是)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol=TCP
    错误 1045 (28000):拒绝用户 'bill'@'localhost' 的访问(使用密码:是)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol=TCP
    错误 1045 (28000):拒绝用户 'bill'@'localhost' 的访问(使用密码:是)

编辑 3

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

    root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    欢迎使用 MySQL 监视器 (...)

    mysql> 选择用户(),当前用户();
    +----------------+----------------+
    | 用户() | 当前用户() |
    +----------------+----------------+
    | 账单@localhost | @本地主机 |
    +----------------+----------------+
    一组中的 1 行(0.01 秒)

结论 1,来自编辑 1:可以'bill'@'%'通过套接字进行身份验证。

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

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

于 2012-06-26T22:36:56.007 回答
160

尝试:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
于 2012-10-25T20:17:57.827 回答
96

当你跑

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;

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

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();

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 客户端的协议。

于 2012-06-26T17:40:32.133 回答
36

超级迟到

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


mysql -u root -p

只需按下[ENTER]密码即可。


一旦我这样做了,它就起作用了。希望这可以帮助某人。

于 2016-10-03T23:46:03.643 回答
22

当您输入 时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 地址。

于 2012-06-26T17:39:13.770 回答
22

在我的案例中,一个相关的问题是尝试使用以下方式进行连接:

mysql -u mike -p mypass

-u #uname# 之间显然允许使用空格,但-p 和 #password# 之间不允许使用空格

因此需要:

mysql -u mike -pmypass

否则 -p mypass mysql 之间的空格将 'mypass' 作为数据库名称

于 2014-08-20T18:19:28.807 回答
20

如果您忘记密码或想修改密码。您可以按照以下步骤操作:

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。

4:更改用户数据库

mysql> 使用 mysql
读取表信息以补全表名和列名 可以关闭此功能以更快启动 -A 数据库已更改

5:修改您的密码您的新密码应输入“()”

mysql>更新用户设置密码=密码('root123')其中用户='root';
查询正常,3 行受影响(0.00 秒)
匹配行:3 更改:3 警告:0

6:冲洗

mysql> 刷新权限;

7:退出

mysql>退出
再见

8:重启mysql

[root@cy400 ~]#服务mysqld重启;
停止 MySQL:[OK]
启动 MySQL:[OK]

Bingo!您可以使用您的用户名和新密码连接您的数据库:

[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
于 2016-05-26T07:48:26.377 回答
20

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

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

sudo mysql -u root -p

然后输入您的密码,这应该可以。

于 2018-08-04T11:00:09.773 回答
18

避免让自己头疼……您的问题可能是您缺少密码周围的引号。至少那是我绕道了 3 个小时的情况。

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

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

搜索“这是一个典型的用户选项文件:”并查看他们在其中陈述的示例。祝你好运,我希望能节省一些时间。

于 2014-07-25T17:14:07.667 回答
13

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

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

于 2012-09-24T15:58:05.290 回答
8

我为自己找到的最佳解决方案是。

我的用户是声纳,每当我尝试从外部或其他机器连接到我的数据库时,我都会收到错误消息

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

此外,当我从另一台机器上尝试这个并通过 Jenkins 工作时,我的访问 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';
于 2014-09-18T14:33:59.397 回答
6

这是以下之间的区别:

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;
于 2015-12-01T17:26:06.320 回答
5

好的,我不确定,但可能这是 mysql 安装目录中的 my.cnf 文件是罪魁祸首。注释掉这一行,问题可能就解决了。

bind-address = 127.0.0.1
于 2012-04-25T09:37:17.453 回答
5

不确定其他人是否会觉得这很有帮助,但我遇到了同样的错误,并到处搜索任何匿名用户……但没有。问题最终是用户帐户设置为“需要 SSL” - 我在 PHPMyAdmin 中通过转到用户帐户并单击用户的编辑权限来找到它。一旦我取消选中此选项,一切都按预期工作!

于 2016-03-10T02:53:27.523 回答
5

当您的密码包含一些特殊字符(如 @、$ 等)时也会发生这种情况。为避免这种情况,您可以将密码用单引号括起来:

$ 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>
于 2016-07-08T06:44:42.157 回答
5

更新:在 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';
于 2019-09-12T13:59:34.607 回答
4

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

我开发了一些基本视图,在开发站点创建并将它们转移到生产站点。那周晚些时候,我更改了一个 PHP 脚本,突然出现错误,用户'local-web-user'@'localhost'的访问被拒绝。数据源对象没有改变,所以我专注于 MySQL 中的数据库用户,同时担心有人入侵了我的网站。幸运的是,该网站的其余部分似乎安然无恙。

后来事实证明,这些观点是罪魁祸首。我们的对象传输是使用另一个(和远程:admin@ip-address)用户而不是本地网站用户完成的。因此,视图是使用 'admin'@'ip-address' 作为定义者创建的。视图创建 SECURITY 默认为

SQL SECURITY DEFINER

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

SQL SECURITY INVOKER

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

于 2015-10-06T13:07:43.617 回答
4

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

将其设置为 egmysql_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'@'%' 的插件值为空。该用户将被忽略,并且没有人可以再使用该用户登录。

我在这里发布这个答案可能是为了避免有人像我一样使用同样荒谬的时间。

于 2016-09-18T23:43:10.213 回答
4

调试总结

  • 检查拼写错误:用户名或密码。
  • 检查主机名并将其与 mysql.user 表主机名进行比较。
  • 检查用户是否存在。
  • 检查主机是否包含IP地址或主机名。

您很有可能在工作中多次遇到此问题。由于输入错误的用户名或密码,我经常遇到此问题。尽管这是原因之一,但您还有其他很多机会可能会遇到此问题。有时,它看起来非常相似,但是当您深入挖掘时,您会意识到导致此错误的多种因素。这篇文章将详细解释大多数常见原因以及解决此问题的方法。

可能的原因:

  • 案例 1:输入错误:用户名或密码。

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

解决方案:

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

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

MySQL 为用户访问提供基于主机的限制作为安全功能。在我们的生产环境中,我们曾经将访问请求限制在应用程序服务器上。此功能在许多生产场景中确实很有帮助。

解决方案:

当您遇到此类问题时,首先通过检查 mysql.user 表来检查您的主机是否被允许。如果未定义,您可以更新或插入新记录到 mysql.user 表。通常,出于安全考虑,从远程计算机以 root 用户身份访问是禁用的,这不是最佳实践。如果您需要从多台机器访问您的服务器,请仅授予对这些机器的访问权限。最好不要使用通配符 (%) 并提供通用访问。让我更新 mysql.user 表,现在演示用户可以从任何主机访问 MySQL 服务器。

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

当您尝试访问的用户在 MySQL 服务器上不存在时,会发生此类错误。

解决方案:

当您遇到此类问题时,只需检查用户是否存在于 mysql.user 表中。如果记录不存在,用户将无法访问。如果该用户需要访问,请使用该用户名创建一个新用户。

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

要点

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

  • 禁用从远程计算机的 root 登录。

  • 使用代理用户概念。

与此主题相关的其他概念很少,并且深入了解这些主题的细节与本文的范围非常不同。我们将在接下来的文章中研究以下相关主题。

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

我希望这篇文章能帮助您修复 MySQL 错误代码 1045 Access denied for user in MySQL。

于 2017-11-14T07:26:54.253 回答
4

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

于 2018-12-27T07:12:32.953 回答
3

我希望您还没有因为删除 mysql 中的 debian-sys-maint 用户而造成更大的损害

让您的 mysql 守护程序以正常方式运行。如下图所示启动你的mysql客户端

mysql -u debian-sys-maint -p

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

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

于 2013-09-25T12:27:02.980 回答
2

这可能适用于极少数人,但这里有。不要!在密码中使用感叹号。

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

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

于 2019-02-12T10:23:13.347 回答
2

我有类似的问题,因为我的密码包含“;” char 在我第一次创建密码时破坏了我的密码。如果可以帮助您,请谨慎行事。

于 2019-09-16T10:58:15.390 回答
2

如今!解决方案:

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

Wampserver 3.2.0 新安装或升级

可能默认xamp使用mariaDB是好的。

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

连接到mysql

在安装时它要求使用mariaDBor MySql,但 mariaDB 被选中为默认值,您无法更改它,检查mysql选项并安装。

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

右键单击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/

于 2020-01-30T14:16:58.717 回答
2

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

我使用更改了密码ALTER USER 'root'@'localhost' IDENTIFIED BY 'new Password';并且它有效

于 2020-12-10T21:28:32.333 回答
1

在 Windows 上,解决方法如下:

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

  1. 从控制面板卸载mysql
  2. C:\Program Files,C:\Program Files (x86)从和中删除 MySql 文件夹C:\ProgramData
  3. 安装mysql
于 2018-03-04T08:55:27.533 回答
0

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

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

一种是指定一个/etc/hosts在您尝试登录时不会被文件反向解析的 ip。例如,服务器的 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,你应该调用 command grant all privileges on *.* to bill@localhost identified by 'billpass';。在这种情况下,您将能够使用 command 登录mysql -u bill -p。登录后,select user();命令返回bill@localhost

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

于 2014-01-17T09:09:01.597 回答
0

我通过删除旧的错误用户'bill'条目解决了这个问题(这是重要的部分:来自mysql.usermysql.db),然后创建了与之前一样的用户:

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

工作,用户正在连接。现在我将从中删除一些previlegies :)

于 2014-05-03T04:06:44.660 回答
0

我遇到了同样的错误。不起作用的设置如下:

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

于 2018-08-11T00:17:41.270 回答
0

操作系统:windows

我的错误信息是:

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

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

所以我的解决方案是以管理员身份打开cmd,然后就可以了。

于 2018-10-25T02:44:31.470 回答
0

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

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

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

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

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

但是,这成功了:

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

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

输入密码:

于 2019-07-04T14:14:28.120 回答
0

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

于 2020-01-20T10:11:58.097 回答
0

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

mysql -p

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

于 2021-01-09T17:21:45.897 回答
0

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

3306 => 3306 不起作用(因为我有一个本地 mysql 正在运行)

3307 => 3306 有效!

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

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

3307是本地端口,3306是远程端口。

于 2021-04-10T12:51:57.737 回答
-1

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

以上只是介绍:

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

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

于 2012-06-27T14:15:43.133 回答
-1

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

于 2014-02-11T13:58:54.393 回答
-1

如果您使用旧版本的 MySQL UI(如 SQLYoug)生成错误哈希的密码,也会出现问题。

使用 SQL 脚本创建用户将解决此问题。

于 2014-05-05T15:34:34.953 回答
-1

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

令我惊讶的是,我使用 MySQL Workbench 创建了用户,并且我希望它能够执行所有必要的功能来完成任务。

于 2014-08-29T11:56:00.520 回答
-1

对于 Mac 用户,如果他们仍然有问题(就像我的情况一样),我发现这个解决方案对我有用:MySQL 命令行 '-bash command not found'

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

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

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

mysql -u root

否则你使用了错误的root密码。

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

于 2016-02-28T16:35:44.150 回答
-1

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

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

MySQL 用户帐户有两个组成部分:用户名和主机名。用户名标识用户,主机名指定用户可以连接的主机。将用户名和主机名组合起来创建一个用户帐户:

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

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

于 2016-08-26T17:08:31.450 回答