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

Ali*_*Ali 399 mysql access-denied

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

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

mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

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

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)

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

grant all privileges on *.* to 'bill'@'%' with grant option;
Run Code Online (Sandbox Code Playgroud)

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

mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)

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

ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)

Ran*_*eed 421

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

根据手册:

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

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

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

因此,这样的匿名用户将"屏蔽"任何其他用户,就像'[any_username]'@'%'连接时一样localhost.

'bill'@'localhost'匹配'bill'@'%',但会匹配(例如)''@'localhost'beforehands.

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


以下编辑主要与主要问题无关.这些仅用于回答本主题中其他评论中提出的一些问题.

编辑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:可以'bill'@'%'通过套接字进行身份验证.

结论2,从编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(除了一个人不能像其他人一样连接,但'something'@'localhost'通过套接字,显然).

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

  • 对于任何好奇为什么'bill'@'localhost'匹配''@ localhost'就像我一样,一个空字符串实际上在MySQL的身份验证算法中扮演外卡. (9认同)
  • @RandomSeed感谢您的评论!可能我应该删除匿名用户.PS我发现http://dev.mysql.com/doc/refman/5.1/en/default-privileges.html说这些用户肯定可以删除:`DROP USER''@'localhost';`.某些特殊目的不需要它们. (6认同)
  • 这就是答案!为什么这不是在每个 mysql 手册中都以粗体大写字母出现。删除匿名用户,否则它会终止您从 LOCALHOST 登录的所有尝试! (4认同)
  • @Sanja要特别小心这个解决方法.您可能允许从任何位置匿名访问您的数据库.如有疑问,我宁愿删除用户. (2认同)
  • 我很高兴找到了这个。我的一天几乎毁了!我花了数小时的时间来寻找错误,我发现这完全是由于一些愚蠢的“''@'localhost'”。我们生活,我们学习! (2认同)

小智 136

尝试:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Run Code Online (Sandbox Code Playgroud)

  • 这是相当危险的,如果有人破解您的帐单@ localhost mysql帐户,他将无限访问您的mysql服务器的所有数据库. (9认同)
  • 与gran选项:-) (3认同)
  • Whehey.我不得不在我的用户'myusername'@'myhost.static.myip.com'上面引用它然后它起作用了. (2认同)

Rol*_*DBA 71

当你跑

mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)

并得到了这个错误

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

mysqld期待你连接为 bill@localhost

尝试创建 bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Run Code Online (Sandbox Code Playgroud)

如果要远程连接,则必须使用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
Run Code Online (Sandbox Code Playgroud)

登录后,请运行此命令

SELECT USER(),CURRENT_USER();
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

好的,请注意以匿名用户身份登录:

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>
Run Code Online (Sandbox Code Playgroud)

身份验证排序非常严格.它从最具体到最低的检查.我在DBA StackExchange中写了关于这种身份验证风格的文章.

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

  • `--protocol = TCP`是关键.非常感谢你! (2认同)

gar*_*mac 20

超级到此为止

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


mysql -u root -p

只需按[ENTER]密码即可.


一旦我做到了,它就有效了.希望这有助于某人.


Dav*_*eli 18

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

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

sudo mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

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


nos*_*nos 17

键入时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地址.


mst*_*ram 16

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

mysql -u mike -p mypass
Run Code Online (Sandbox Code Playgroud)

空白显然是允许的-u#UNAME#之间,但不是在-p和#密码#之间

因此需要:

mysql -u mike -pmypass
Run Code Online (Sandbox Code Playgroud)

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

  • 或: mysql -u usrname -p -- 这会阻止任何人看到密码,因为它会删除一个新行并要求输入密码而不显示它 (2认同)

Li *_*jun 16

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

1:停止你的mysql

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

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> update user set password = password('root123')where user ='root';
查询正常,3行受影响(0.00秒)
匹配的行数:3已更改:3警告:0

6:同花顺

mysql> flush特权;

7:退出

mysql>退出
再见

8:重启mysql

[root @ cy400~] #service mysqld restart;
停止MySQL:[确定]
启动MySQL:[确定]

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
Run Code Online (Sandbox Code Playgroud)


mim*_*lea 14

避开主要问题...你的问题可能是你错过了密码周围的引号.至少那是我的情况,绕了我3个小时.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost
Run Code Online (Sandbox Code Playgroud)

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

搜索"这是一个典型的用户选项文件:"并查看它们在那里说明的示例.祝你好运,我希望能节省一些时间.


fev*_*lou 12

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

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


Abh*_*ble 6

我找到的最佳解决方案是.

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

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

此外,当我从另一台机器和Jenkins工作尝试这个时,我的访问URL是

alm-lt-test.xyz.com
Run Code Online (Sandbox Code Playgroud)

如果要远程连接,可以使用以下不同方式指定它:

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
Run Code Online (Sandbox Code Playgroud)

要使用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';
Run Code Online (Sandbox Code Playgroud)


Ger*_*erd 6

这是以下之间的区别:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';
Run Code Online (Sandbox Code Playgroud)

核实:

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
+---------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

命令

mysql -u bill -p
Run Code Online (Sandbox Code Playgroud)

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

'bill'@'localhost' 没有权限

你得到错误:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

解决问题:

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

grant all privileges on . to 'bill'@'localhost' with grant option;
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 5

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

bind-address = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)


Ala*_*lan 5

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


Pra*_*ore 5

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

$ mysql -usomeuser -p's0mep@$$w0Rd'
Run Code Online (Sandbox Code Playgroud)

或者输入时不使用密码。将其留空,然后在终端询问时键入。这是推荐的方式。

$ 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>
Run Code Online (Sandbox Code Playgroud)

  • 这确实可能是一个问题(对我来说)。我的任何帐户的所有密码都是使用“pwgen”生成的。今天我为 MySQL 数据库及其用户生成了一个新数据库。不幸的是,密码包含一个反斜杠“\”,我没有将其识别为错误起源(我什至没有想到这一点)。因此,我花了几个小时寻找解决方案。在绝望中将密码设置为“123”后,登录终于成功了。…用户应该意识到,一些特殊字符可能会导致问题,因为 MySQL 不会显示任何有关使用密码(例如“daiy4ha4in7chooshuiphie\Th*aew”)的警告。 (3认同)

Jal*_*zir 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';


小智 5

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

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