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

首先让我提一下,我已经经历了许多build议的问题,并没有发现相关的答案。 这是我正在做的。

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

mysql -u root -p 

然后,我创build了一个新的用户帐单与主机%

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

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

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

然后我退出root用户,并尝试login帐单:

 mysql -u bill -p 

input正确的密码,并得到这个错误:

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

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

根据手册 :

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

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

(…)服务器使用sorting规则,首先排列具有最特定主机值的行。 文字主机名(如“localhost”)和IP地址是最具体的。

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

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

推荐的解决scheme是放弃这个匿名用户(反正这通常是件好事)。


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

编辑1

通过套接字authentication为'bill'@'%'


     root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    欢迎来到MySQL监控器(...)

     mysql> SELECT用户,主机从mysql.user;
     + ------ + ----------- +
     | 用户| 主机|
     + ------ + ----------- +
     | 账单|  %|
     |  root |  127.0.0.1 |
     |  root |  :: 1 |
     |  root |  localhost |
     + ------ + ----------- +
    设置4行(0.00秒)

     mysql> SELECT USER(),CURRENT_USER();
     + ---------------- + ---------------- +
     |  USER()|  CURRENT_USER()|
     + ---------------- + ---------------- +
     |  bill @ localhost |  bill @%|
     + ---------------- + ---------------- +
    一排(0.02秒)

     mysql> SHOW VARIABLES LIKE'skip_networking';
     + ----------------- + ------- +
     | variables名| 值|
     + ----------------- + ------- +
     |  skip_networking |  ON |
     + ----------------- + ------- +
    一排(0.00秒)

编辑2

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


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

     mysql> CREATE USER'''localhost'IDENTIFIED BY'anotherpass';
    查询OK,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  - 协议= TCP
    错误1045(28000):访问拒绝用户'bill'@'localhost'(使用密码:是)
     root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
         -hlocalhost  - 协议= TCP
    错误1045(28000):访问拒绝用户'bill'@'localhost'(使用密码:是)

编辑3

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


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

     mysql> SELECT USER(),CURRENT_USER();
     + ---------------- + ---------------- +
     |  USER()|  CURRENT_USER()|
     + ---------------- + ---------------- +
     |  bill @ localhost |  @localhost |
     + ---------------- + ---------------- +
    一排(0.01秒)

结论1,从编辑1:通过套接字可以validation'bill'@'%'

结论2,从编辑2:无论是通过TCP连接还是通过套接字连接,对authentication过程都没有影响(显然,除了通过套接字连接外,其他人不能通过套接字连接)。

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

尝试:

 ~$ mysql -u root -p Enter Password: mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option; 

当你跑了

 mysql -u bill -p 

并得到这个错误

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

mysqld期待你作为bill@localhost进行连接

尝试创buildbill@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 

一旦你login,请运行这个

 SELECT USER(),CURRENT_USER(); 

USER()报告你如何尝试在MySQL中进行身份validation

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

这将让你更好地了解如何以及为什么你被允许login到MySQL。 为什么这个观点很重要? 它与用户authenticationsorting协议有关。

这里是一个例子:我将在我的桌面MySQL上创build一个匿名用户

 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> 

好的看我匿名用户login:

 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> 

authenticationsorting非常严格。 它从最具体到最小的检查。 我在DBA StackExchange中描述了这种authentication风格

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

当你键入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地址。

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

我也遇到了别人的服务器设置相同的问题。 我通常不会select在安装MySQL时创build一个匿名用户,所以没有注意到这一点。 最初,我以“root”用户身份login,并创build了几个“普通”用户(也就是只有dbs的权限,用户名为前缀的用户),然后注销,然后继续validation第一个普通用户。 我无法login。无论是通过phpMyAdmin,还是通过shell。 原来,罪魁祸首就是这个“任何”用户。

在我的情况相关的问题是试图连接使用:

 mysql -u mike -p mypass 

空格显然是允许的-u#uname#之间,而不是 -p和#之间的密码#

因此需要:

 mysql -u mike -pmypass 

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

保存一个主要的头痛…你的问题可能是你错过了密码周围的报价。 至less这是我的情况,绕行了3个小时。

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

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

search“这是一个典型的用户选项文件:”,看看他们在那里的例子。 祝你好运,我希望能有一些时间去拯救别人。

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

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:打开一个新窗口并inputmysql -u root

[root @ cy400〜]#mysql -u root
欢迎来到MySQL监视器。 命令以; 或\ g。

4:更改用户数据库

mysql>使用mysql
阅读表格信息以完成表格和列名称您可以closures此function以快速启动-A数据库已更改

5:修改你的密码你的新密码应该input“()”

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

6:冲水

mysql>刷新权限;

7:退出

mysql>退出
再见

8:重启mysql

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

答对了!!!
你可以用你的用户名和新密码连接你的数据库
[root @ cy400〜]#mysql -u root -p
input密码:admin123
欢迎来到MySQL监视器。 命令以; 或\ g。
你的MySQL连接ID是2
服务器版本:5.0.77源代码分发
input'help' 或'\ h'寻求帮助。 input'\ c'清除缓冲区。
mysql>退出
再见

超级迟到这个

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


mysql -u root -p

只需按[ENTER]input密码。


一旦我做到了,它的工作。 希望这有助于某人。

我发现的最好的解决scheme是。

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

 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'; 

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

 bind-address = 127.0.0.1 

回复:mySQL错误1045(28000):访问拒绝用户'root'@'localhost

我希望你也没有通过删除mysql中的debian-sys-maint用户造成更多的损害

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

 mysql -u debian-sys-maint -p 

在另一个terminal中,“cat”文件/etc/mysql/debian.cnf。 该文件包含密码; 提示input密码时粘贴该密码。

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

祝你好运。

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

我在开发现场创build了几个基本视图,并将它们转移到生产现场。 那一周晚些时候,我改变了一个PHP脚本,突然出现了一个错误:Access被拒绝用户“local-web-user”@“localhost”。 数据源对象没有改变,所以我专注于MySQL中的数据库用户,同时担心有人攻击我的网站。 幸运的是,其余的网站似乎没有受到伤害。

后来发现这些意见是罪魁祸首。 我们的对象传输是使用另一个(和远程:admin @ ip地址)用户比本地网站用户完成。 所以这些视图是以'admin'@'ip-address'作为定义者创build的。 视图创build安全默认是

 SQL SECURITY DEFINER 

当本地networking用户试图使用视图时,它在定义者缺乏使用表的权限上绊倒。 一旦安全改为:

 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; 

不知道是否有其他人会发现这有帮助,但我遇到了同样的错误,并搜遍了所有匿名用户…并没有任何。 问题最终导致用户帐户被设置为“Require SSL” – 我在PHPMyAdmin中find了这个帐户,转到用户帐户并单击用户的编辑权限。 只要我不选这个选项,一切都按预期工作!

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

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

或者在input时不要使用密码。 留空,然后在terminal询问时input。 这是推荐的方法。

 $ 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> 

对我来说,这个问题是由于MySQL 5.7.2的一个新特性造成的:如果userplugin字段为空, user条目将被忽略

将其设置为例如mysql_native_password重新启用它们:

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

请参阅“身份validation注意事项”下的MySQL 5.7.2发行说明 。

出于某种原因(也许是因为我的4.1之前的密码哈希已被删除), mysql_upgrade脚本没有设置默认的插件值。

我在/var/log/mysql/error.log发现了以下警告消息:

[Warning]用户input'foo'@'%'有一个空的插件值。 用户将被忽略,没有人可以与此用户login了。

我在这里发布这个答案,也许不会像我一样使用同样荒谬的时间在这个上。

我解决了这个问题,通过删除旧的越野车用户帐单条目(这是重要的部分:从mysql.usermysql.db ),然后创build了同样的用户悲伤之前:

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

工作,用户正在连接。 现在我将删除它的一些previlegies 🙂

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

以上只是介绍:

实际上这两个用户'bill'@'localhost''bill'@'%'是不同的MySQL账户,因此两者都应该使用自己的authentication细节,如密码。

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

当你运行mysql -u bill -plocalhost被parsing为你的ip,因为它是127.0.0.1,在你的/etc/hosts文件中,默认情况下是127.0.0.1 localhost 。 所以,mysql会将你解释为bill@'%'而不是bill@'%' 。 这就是为什么在select host, user from mysql.user;root用户有两个不同的loggingselect host, user from mysql.user; 查询。

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

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

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

但是,这只是为了您尝试在同一主机上login一个mysql服务器。 从远程主机,MySQL的行为预期,'%'将授予您login。

确保没有其他正在运行的使用localhost post的SQL实例。 在我们的情况下,另一个实例在与login冲突的本地主机上运行。 关掉解决了这个问题。

如果您使用旧版本的MySQL UI(如SQLYoug)生成具有错误散列密码的问题,也可能出现此问题。

用SQL脚本创build用户将解决这个问题。

我有同样的问题,但在我的情况下,解决scheme是由eggyal的评论解决。 我也有一个匿名用户,但删除它并没有解决问题。 “冲洗特权”的命令虽然工作。

对我来说令人惊讶的是,我使用MySQL Workbench创build了用户,并且期望执行所有必要的function来完成任务。

对于Mac用户,如果他们仍然有问题(就像我的情况),我发现这个解决scheme为我工作在这里

要在MacBookterminal上使用命令,例如$ mysql,您需要使用以下命令导出path:

export PATH = $ PATH:/ usr / local / mysql / bin /考虑默认安装使用以下命令以root用户身份获取mysql提示符:

mysql -u root否则你使用的是错误的root密码。

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

百分号表示所有的IP,所以本地主机是多余的…有没有需要本地主机的第二个logging。

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

MySQL用户帐户有两个组件:用户名和主机名。 用户名标识用户,主机名指定用户可以连接的主机。 用户名和主机名相结合创build一个用户帐户:

'<user_name>'@'<host_name>'主机名'<user_name>'@'<host_name>'您可以为主机名指定特定的IP地址或地址范围,也可以使用百分号(“%”)来启用该用户从任何主机login。

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

这对我工作:

 UPDATE mysql.user SET user='xxxx', password=PASSWORD('xxxx') WHERE user=''; FLUSH PRIVILEGES; 

正如@RandomSeed所说的,你必须在DBMS中拥有一个匿名用户。 给他们一个名字。 它会工作

debugging摘要

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

有一个很大的机会,你可能在你的工作中多次遇到这个问题。 由于input的用户名或密码不正确,大部分时间都发生了这个问题。 虽然这是其中一个原因,但还有很多机会可以解决这个问题。 有时,它看起来非常相似,但是当你深入挖掘,你会发现导致这个错误的多种因素。 本文将详细解释大部分常见原因并解决此问题的方法。

可能的原因:

  • 案例1:错别字:用户名或密码。

这是这个错误最常见的原因。 如果你错误地input了用户名或密码,你肯定会得到这个错误。

解:

解决这种types的错误非常简单。 只需input正确的用户名和密码。 这个错误将被解决。 如果您忘记了密码,您可以重置用户名/密码。 如果您忘记了admin / root帐户的密码,可以使用许多方法来重置/重新获取root密码。 如果您忘记了root密码,我将发布另一篇关于如何重置root密码的post。

  • 情况2:从错误的主机访问。

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

解:

当你遇到这种types的问题时,首先检查你的主机是否被允许通过检查mysql.user表。 如果没有定义,你可以更新或插入新的logging到mysql.user表。 通常,从远程机器以root用户身份进行访问被禁用,由于安全问题,这不是最佳实践。 如果您有要求从多台机器访问您的服务器,只能访问这些机器。 最好不要使用通配符(%)并给出通用访问。 让我更新mysql.user表,现在demouser可以从任何主机访问MySQL服务器。

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

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

解决scheme:

当你遇到这种types的问题时,只要检查用户是否存在于mysql.user表中。 如果logging不存在,用户将无法访问。 如果该用户需要访问,则使用该用户名创build一个新用户。

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

重要的一点

  • 在定义用户主机时,不build议使用通配符,请尝试使用确切的主机名。

  • 禁用远程机器的rootlogin。

  • 使用代理用户的概念。

与这个主题相关的其他概念很less,并且进入这些主题的细节是非常不同的这篇文章的范围。 我们将在即将到来的文章中查看以下相关主题。

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

我希望这篇文章能够帮助你解决MySQL中的错误代码1045访问被拒绝的问题。

也许你需要添加MySQL端口给你的命令与-P。

像这样mysql -u root -p password -P **portNumber**