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警告:06:冲水
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的一个新特性造成的:如果user
的plugin
字段为空, 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.user和mysql.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 -p
, localhost
被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**