MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
首先让我提一下,我已经经历了许多建议的问题,并没有找到相关的答案。 这就是我正在做的事情。
我已连接到我的Amazon EC2实例。 我可以使用以下命令使用MySQL root登录:
1 | mysql -u root -p |
然后我用主机%创建了一个新的用户账单
授予用户账单的所有权限:
然后我从root用户退出并尝试使用bill登录:
1 | mysql -u bill -p |
输入正确的密码并收到此错误:
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
您可能有一个匿名用户
根据手册:
When multiple matches are possible, the server must determine which of
them to use. It resolves this issue as follows: (...)
- When a client attempts to connect, the server looks through the rows [of table mysql.user] in sorted order.
- The server uses the first row that matches the client host name and user name.
(...)
The server uses sorting rules that order rows with the most-specific Host values first.
Literal host names [such as 'localhost'] and IP addresses are the most specific.
因此,当从
推荐的解决方案是删除这个匿名用户(这通常是一件好事)。
以下编辑主要与主要问题无关。这些仅用于回答本主题中其他评论中提出的一些问题。
编辑1
通过套接字认证为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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
完全相同的设置,除了我重新激活网络,我现在创建一个匿名用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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中的情况相同,现在提供匿名用户的密码。
1 2 3 4 5 6 7 8 9 10 | 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:可以通过套接字验证为
结论2,从编辑2:无论是通过TCP连接还是通过套接字连接都不会对身份验证过程产生影响(除了一个人不能像其他任何人一样通过套接字连接
结论3,来自编辑3:虽然我指定了
尝试:
1 2 3 4 |
当你跑
1 | mysql -u bill -p |
并得到了这个错误
mysqld希望你以
尝试创建
1 2 |
如果要远程连接,则必须使用TCP / IP指定DNS名称,公共IP或127.0.0.1:
1 2 3 | mysql -u bill -p -[email protected] mysql -u bill -p -h10.1.2.30 mysql -u bill -p -h127.0.0.1 --protocol=TCP |
登录后,请运行此命令
1 |
USER()报告您尝试在MySQL中进行身份验证的方式
CURRENT_USER()报告如何允许您从mysql.user表中在MySQL中进行身份验证
这将使您更好地了解允许您登录mysql的方式和原因。为什么这个观点很重要?它与用户身份验证订购协议有关。
这是一个例子:我将在我的桌面MySQL上创建一个匿名用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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> |
好的,请注意以匿名用户身份登录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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客户端的协议。
键入
但是,您提供的授权
如果要授予对本地unix套接字的访问权限,则需要授予'bill'@'localhost'权限,这与'bill'@'127.0.0.1'不一样。
您还可以使用TCP / IP与mysql命令行客户端进行连接,以匹配您已授予的权限,例如:运行
超级到此为止
我尝试了所有这些其他答案并运行了许多不同版本的
只需按
一旦我做到了,它就有效了。希望这有助于某人。
避开主要问题...你的问题可能是你错过了密码周围的引号。至少那是我的情况,绕了我3个小时。
1 2 3 4 |
http://dev.mysql.com/doc/refman/5.7/en/option-files.html
搜索"这是一个典型的用户选项文件:"并查看它们在那里说明的示例。祝你好运,我希望能节省一些时间。
我的案例中的一个相关问题是尝试连接使用:
1 | mysql -u mike -p mypass |
显然允许在-u#uname#之间使用空格,但在-p和#password#之间不允许
因此需要:
1 | mysql -u mike -pmypass |
否则在-p mypass mysql之间使用空格将'mypass'作为数据库名称
如果您忘记了密码或想要修改密码。您可以按照以下步骤操作:
1 :stop your mysql
[root@maomao ~]# service mysqld stop
Stopping MySQL: [ OK ]2:使用"--skip-grant-tables"重启mysql
[root@mcy400 ~]# mysqld_safe --skip-grant-tables
[root@cy400 ~]# Starting mysqld daemon with databases from /var/lib/mysql3:打开一个新窗口并输入mysql -u root
[root@cy400 ~]# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.4:更改用户数据库
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed5:修改密码你的新密码应输入"()"
mysql> update user set password=password('root123') where user='root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 06:同花顺
mysql> flush privileges;
7:退出
mysql> quit
Bye8:重启mysql
[root@cy400 ~]# service mysqld restart;
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]BLOCKQUOTE>
Bingo!您可以使用您的用户名和新密码连接数据库:
1
2
3
4
5
6
7
8
解决方案是删除匿名(Any)用户!
我在其他人的服务器设置上也遇到了同样的问题。我通常不会在安装MySQL时选择创建匿名用户,所以没有注意到这一点。最初我以"root"用户身份登录并创建了几个"普通"用户(也就是用户只在dbs上使用其用户名作为前缀的权限),然后注销,然后继续验证第一个普通用户。我无法登录。既不通过phpMyAdmin,也不通过shell。事实证明,罪魁祸首是这个"任何"用户。
我找到的最佳解决方案是。
我的用户是声纳,每当我试图从外部或其他机器连接到我的数据库时,我收到错误
此外,当我从另一台机器和Jenkins工作尝试这个时,我的访问URL是
1 alm-lt-test.xyz.com如果要远程连接,可以使用以下不同方式指定它:
1
2
3
4 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访问它,您只需执行以下查询。
1
2
3
4
好吧,我不确定但是这可能是my.cnf文件里面的mysql安装目录是罪魁祸首。
注释掉这一行,问题可能会得到解决。
1 bind-address = 127.0.0.1
这是一个区别:
和
核实:
1
2
3
4
5
6
7
8
9
10 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
+---------------+----------------------------+命令
1 mysql -u bill -p访问隐含于'bill'@'localhost'而不是'bill'@'%'。
"bill"@"localhost"没有权限
你得到错误:
解决问题:
1
2
3
当您的密码包含一些特殊字符(如@,$等)时,也会发生这种情况。
要避免这种情况,您可以用单引号包装密码:
1 $ mysql -usomeuser -p's0mep@$$w0Rd'或者输入时不要使用密码。将其留空,然后在终端询问时输入。这是推荐的方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ 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>
我有一个类似的问题 - 在我第一次尝试以root身份进入MySql时,它告诉我拒绝访问。结果我忘了使用sudo ...
因此,如果您在root首次尝试失败,请尝试:
sudo mysql -u root -p 然后输入你的密码,这应该工作。
只是想让你知道一个不寻常的情况我收到了同样的错误。也许这有助于将来的某些人。
我开发了一些基础视图,在开发站点创建并将它们传输到生产站点。那个星期晚些时候我改变了一个PHP脚本,突然出现了一些错误,即用户'local-web-user'@'localhost'拒绝访问Access。数据源对象没有改变,所以我专注于MySQL中的数据库用户,同时担心有人入侵了我的网站。幸运的是,该网站的其余部分似乎没有受到伤害。
后来证明这些观点是罪魁祸首。我们的对象传输是使用另一个(和远程:admin @ ip-address)用户完成的,而不是本地网站用户。所以视图是用'admin'@'ip-address'作为定义者创建的。视图创建SECURITY默认为
当local-web-user尝试使用视图时,它会发现定义器缺少使用表的特权。安全性更改为:
问题得到了解决。根据错误消息,实际问题与预期完全不同。
对我来说,这个问题是由MySQL 5.7.2的一个新功能引起的:如果
user 字段为空,则忽略user 条目。将其设置为例如
mysql_native_password 重新启用它们:请参阅"身份验证说明"下的MySQL 5.7.2发行说明。
出于某种原因(可能是因为我的4.1之前的密码哈希被删除),
mysql_upgrade 脚本没有设置默认的插件值。通过注意
/var/log/mysql/error.log 中的以下警告消息我发现:[Warning] User entry 'foo'@'%' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
我在这里发布这个答案,也许可以拯救某人使用与我相同的荒谬时间。
我希望你删除mysql中的debian-sys-maint用户也没有造成更多伤害
让你的mysql守护进程以正常方式运行。启动你的mysql客户端,如下所示
1 mysql -u debian-sys-maint -p在另一个终端中,
cat 文件/etc/mysql/debian.cnf 。该文件包含密码;在提示时粘贴该密码。http://ubuntuforums.org/showthread.php?t=1836919
调试摘要
- 检查拼写错误:用户名或密码。
- 检查主机名并将其与mysql.user表主机名进行比较。
- 检查用户是否存在。
- 检查主机是否包含IP地址或主机名。
您很可能在工作中多次遇到此问题。由于输入的用户名或密码不正确,我很多时候都会遇到此问题。虽然这是其中一个原因,但还有很多机会可能会遇到这个问题。有时,它看起来非常相似,但是当你深入挖掘时,你会发现导致这个错误的多种因素。本文将详细解释,解决此问题的大多数常见原因和解决方法。
可能的原因:
- 案例1:错字错误:用户名或密码。
这是此错误的最常见原因。如果您错误地输入了用户名或密码,肯定会收到此错误。
解:
这类错误的解决方案非常简单。只需输入正确的用户名和密码即可。此错误将得到解决。如果您忘记了密码,可以重置用户名/密码。
如果您忘记了admin / root帐户的密码,有很多方法可以重置/重新获取root密码。如果忘记root密码,我将发布另一篇关于如何重置root密码的帖子。
- 案例2:从错误的主机访问。
MySQL为用户访问提供基于主机的限制作为安全功能。在我们的生产环境中,我们过去仅将访问请求限制为应用程序服务器。此功能在许多生产方案中非常有用。
解:
遇到此类问题时,首先检查mysql.user表,检查是否允许主机。
如果未定义,则可以将新记录更新或插入mysql.user表。
通常,由于安全问题,禁用从远程计算机以root用户身份进行访问,这不是最佳做法。
如果您有从多台计算机访问服务器的要求,请仅授予对这些计算机的访问权限。最好不要使用通配符(%)并提供通用访问。
让我更新mysql.user表,现在demouser可以从任何主机访问MySQL服务器。
- 案例3:服务器上不存在用户。
当您尝试访问的用户不存在于MySQL服务器上时,会发生此类错误。
解决方案:
当您遇到此类问题时,只需检查用户是否存在于mysql.user表中。如果记录不存在,则用户无法访问。如果要求该用户访问,请使用该用户名创建新用户。
- 案例4:基于数字和基于名称的主机的混合。
重点
建议在定义用户主机时使用通配符,尝试使用确切的主机名。
禁用远程计算机的root登录。
使用代理用户概念。
与此主题相关的其他概念很少,并且了解这些主题的详细信息是本文的非常不同的范围。我们将在以后的文章中研究以下相关主题。
- 如果忘记了MySQL服务器的root密码该怎么办。
- MySQL Access权限问题和用户相关表。
- MySQL安全功能具有最佳实践。
我希望这篇文章能帮助您修复MySQL中用户拒绝的MySQL错误代码1045访问权限。
我发现了另一种表面上出现的边缘情况;我可以通过SELECT INTO .. OUTFILE以root身份导出到文件系统,但不能作为普通用户导出。虽然这可能是一个权限问题,但我已经看过了,并且没有看到任何特别明显的事情。我只能说,以具有相关数据库所有权限的常规用户身份执行查询会返回导致我进入此主题的访问被拒绝错误。当我在旧项目中找到成功使用SELECT INTO ... OUTFILE的脚本时,我注意到我以root用户身份登录。果然,当我以root身份登录时,查询按预期运行。
不确定是否有其他人会发现这有用,但我遇到了同样的错误并搜索了所有匿名用户...并且没有任何人。问题最终是用户帐户被设置为"要求SSL" - 我在PHPMyAdmin中找到了这一点,方法是转到"用户帐户"并单击"为用户编辑权限"。一旦我取消选中此选项,一切都按预期工作!
操作系统:Windows
我的错误消息是:"MySQL ERROR 1045(28000):拒绝访问用户'root'@'localhost'(使用密码:YES)"
我的理由是不用
administrator permission 打开cmd所以我的解决方案:用
administrator permission 打开cmd,然后就可以了。
我通过删除旧的buggy用户'bill'条目解决了这个问题(这是重要的部分:来自mysql.user和mysql.db),然后创建了同样的用户,之前是悲伤的:
1
2
3
4 FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;工作,用户正在连接。现在我将从中删除一些流行病:)
我遇到了同样的错误。无效的设置如下:
1
2
3
4
5 define("HOSTNAME","localhost");
define("HOSTUSER","van");
define("HOSTPASS","helsing");
define("DBNAME","crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);下面编辑的设置是让它工作的设置。请注意区别?
1
2
3
4
5 define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);区别在于双引号。它们在PHP中相对于Java而言似乎非常重要,它们在转义字符,设置URL以及现在将参数传递给函数时会产生影响。它们更漂亮(我知道),但总是尽可能使用单引号,然后双引号可以嵌套在那些必要的内容中。
当我在Linux机器上测试我的应用程序而不是Windows环境时,出现了这个错误。
如果MySQL在不区分大小写的*操作系统(如Windows)上运行,也可能发生这种情况。
例如我发现尝试使用这些凭据连接到数据库失败:
mysql> grant select on databaseV105。* to'specialuser',由's3curepa5wrd'标识;
$ mysql -specialuser'-p's3curepa5wrd'-h10.61.130.89 databaseV105
ERROR 1045(28000):用户'specialuser'@'10.0.1.113'拒绝访问(使用密码:是)
但是,这成功了:
mysql> grant select on databasev105。* to'specialuser',由's3curepa5wrd'标识;
$ mysql -specialuser'-h10.300.300.400 databaseV105 -p
输入密码:
当您运行
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; 查询结果中root 用户有2个不同记录的原因。有两种方法可以解决此问题。
一种是在尝试登录时指定
/etc/hosts 文件无法反向解析的ip。例如,服务器的IP是10.0.0.2 。运行命令mysql -u bill -p -h 10.0.0.2 时,您将能够登录。如果输入select user(); ,您将获得[email protected] 。当然,任何域名都不应该在/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预期行为,'%'将授予您登录。
这可能适用于极少数人,但这里也是如此。不要在密码中使用exaclamation(!)。我做了,并使用MariaDB得到了上述错误。当我将它简化为数字和字母时,它起作用了。其他字符如@和$工作正常 - 我在同一个实例上的不同用户中使用了这些字符。这个地址的第五个回应引导我解决问题。
在窗口中,如何解决ERROR 1045(28000):拒绝访问用户'root'@'localhost'(使用密码:否)
1
2
3
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
如果您使用旧版本的MySQL UI(如SQLYoug)生成具有错误哈希的密码,也会出现此问题。
使用SQL脚本创建用户将解决问题。
我遇到了同样的问题,但在我的情况下,解决方案是由eggyal的评论解决的。我也有一个匿名用户,但删除它并没有解决问题。"FLUSH PRIVILEGES"命令有效。
令我惊讶的是,我使用MySQL Workbench创建了用户,我希望能够执行所有必要的功能来完成任务。
百分号表示所有ip,因此localhost是多余的...不需要localhost的第二条记录。
实际上,'localhost'在mysql中是特殊的,它意味着通过unix套接字(或我认为的Windows上的命名管道)连接而不是TCP / IP套接字。使用%作为主机不包含'localhost'
MySQL用户帐户有两个组件:用户名和主机名。用户名标识用户,主机名指定用户可以连接的主机。组合用户名和主机名以创建用户帐户:
' '@' '
您可以为主机名指定特定的IP地址或地址范围,或使用百分比字符("%")使该用户能够从任何主机登录。请注意,用户帐户由用户名和主机名定义。例如,
'root'@'%' 是与'root'@'localhost' 不同的用户帐户。
对于Mac用户,如果他们仍然有问题(就像我的情况),我发现这个解决方案对我有用:MySQL命令行'找不到-bash命令'
要在macbook终端上使用命令,即
mysql ,您需要使用以下命令导出路径:考虑默认安装,使用以下命令以root用户身份获取mysql提示符:
1 mysql -u root否则您使用错误的root密码。
参考:在OSX上设置MySQL root用户密码
确保没有其他正在运行的SQL实例正在使用localhost帖子。在我们的例子中,另一个实例在与登录冲突的localhost上运行。关闭它解决了这个问题。