MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (使用密码: YES)
Posted
技术标签:
【中文标题】MySQL ERROR 1045 (28000): Access denied for user \'bill\'@\'localhost\' (使用密码: YES)【英文标题】:MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (使用密码: YES) 【发布时间】:2012-05-05 03:54:23 【问题描述】:首先让我提一下,我已经处理了许多建议的问题,但没有找到相关的答案。这就是我正在做的事情。
我已连接到我的 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' 访问(使用密码:YES)
【问题讨论】:
你FLUSH PRIVILEGES
了吗?
好的,我试过了,没有成功。请有其他建议。
你运行的是什么版本的服务器?我已经看到 5.1 在这方面表现得很奇怪。
这发生在我安装 Magento 时,我犯了一个更愚蠢的错误。输入“mysql -u magento -p magento”提示我输入密码,而不是默认密码,我输入的是 root 密码。
@authentictech 不幸的是,在发布此问题时,没有一个建议的解决方案对我有用。请参阅我自己的回答,帮助我摆脱这种情况。这就是我没有将其中任何一个标记为答案的原因。也许我可以将排名最高的回复标记为答案。
【参考方案1】:
您可能有一个匿名用户 ''@'localhost'
或 ''@'127.0.0.1'
。
根据the manual:
当可能有多个匹配时,服务器必须确定哪一个 他们使用。它解决了这个问题如下:(...)
当客户端尝试连接时,服务器会按排序顺序查看行[of table mysql.user]。 服务器使用与客户端主机名和用户名匹配的第一行。(...) 服务器使用排序规则将具有最具体的主机值优先的行排序。 文字主机名[例如'localhost']和IP地址是最具体的。
因此,当从localhost
连接时,这样的匿名用户会“屏蔽”任何其他用户,例如'[any_username]'@'%'
。
'bill'@'localhost'
确实匹配 'bill'@'%'
,但会事先匹配(例如)''@'localhost'
。
推荐的解决方案是删除这个匿名用户(这通常是一件好事)。
以下编辑大多与主要问题无关。这些只是为了回答这个线程中其他 cmet 提出的一些问题。
编辑 1
通过套接字验证为'bill'@'%'
。
编辑 2
完全一样的设置,除了我重新激活了网络,我现在创建了一个匿名用户''@'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
,但我已被授予匿名用户访问权限。这是因为上面建议的“排序规则”。请注意,在大多数默认安装中,a no-password, anonymous user exists(并且应该被保护/删除)。
【讨论】:
对于那些想知道为什么 'bill'@'localhost' 和我一样匹配 ''@'localhost' 的人来说,一个空字符串实际上是 MySQL 身份验证算法中的通配符。 @Sanja 使用此解决方法时要格外小心。您可能允许从任何位置匿名访问您的数据库。如有疑问,我宁愿删除用户。 @RandomSeed 感谢您的评论!可能我应该删除匿名用户。附言我发现dev.mysql.com/doc/refman/5.1/en/default-privileges.html 说这些用户肯定可以被删除:DROP USER ''@'localhost';
。某些特殊目的不需要它们。
我很高兴找到这个。我的一天几乎被毁了!我花了几个小时来寻找错误,我发现这完全是由于一些愚蠢的''@'localhost'
。我们生活,我们学习!
这就是答案!为什么这不是在每个 mysql 手册中都以粗体大写字母出现。删除匿名用户,否则将终止您从 LOCALHOST 登录的所有尝试!【参考方案2】:
试试:
~$ mysql -u root -p
Enter Password:
mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
【讨论】:
这是相当危险的,如果有人黑了你的 bill@localhost mysql 帐户,他将可以无限访问你的 mysql 服务器的所有数据库。 嘿嘿。我必须在我的用户 'myusername'@'myhost.static.myip.com' 周围加上引号,然后它才起作用。 这对我有用,但我担心我给了用户太多权限 @CsabaToth 你做了,再次降低权限,直到你的用户拥有他需要的东西而不是更多。【参考方案3】:你跑的时候
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>
身份验证顺序非常严格。它从最具体到最少进行检查。 I wrote about this authentiation style in the DBA StackExchange.
不要忘记在必要时显式调用 TCP 作为 mysql 客户端的协议。
【讨论】:
'bill'@'localhost'
应该匹配 'bill@%'
,不是吗?
@Yak 排序顺序不仅仅基于 mysql.user 的用户列。 MySQL 本身不进行任何字符匹配。我在 DBA StackExchange 中写过关于用户身份验证排序协议的文章:dba.stackexchange.com/a/10897/877
@YaK 这就是我特别提到SELECT USER(),CURRENT_USER();
的原因。你几乎不会看到匿名用户出现在这两个函数中,除非设置非常糟糕。
我从没想过排序顺序仅基于mysql.user
。事实上,如果你再看一遍我的回答,你会看到我说过(实际上,手册上说)排序顺序首先基于host
列。你写了很多关于如何检查你当前凭据的文章,但我看不到关于为什么'bill'@'localhost'
无法以'bill'@'%'
登录的信息,这是今天的问题 AFAIK。 OP 的设置可能很差,这就是他收到这些错误的原因。
--protocol=TCP
是关键。非常感谢!【参考方案4】:
迟到了
我尝试了所有这些其他答案并运行了许多不同版本的mysql -u root -p
,但从未运行过
mysql -u root -p
只需按[ENTER]
输入密码。
一旦我这样做了,它就起作用了。希望这可以帮助某人。
【讨论】:
【参考方案5】:当您键入 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 地址。
【讨论】:
"'bill'@'%' 只匹配 TCP/IP 连接" 这是错误的。使用skip-networking
在干净的(原始的、开箱即用的)实例上试用它
@YaK 我无法让 'user'@'%' 在这样的设置中运行,你的意思是应该发生什么?
我可以在没有网络的情况下在 v5.0 上以 'bill'@'%' 的身份连接(因此,通过套接字)。你用的是什么版本?我将在 v5.5 上试用。
请看我更新的答案。我能够通过 v5.5 上的套接字以 'bill'@'%'
身份登录。【参考方案6】:
在我的案例中,一个相关的问题是尝试使用连接:
mysql -u mike -p mypass
Whitespace 显然允许在 -u #uname# 之间,但 NOT 在 -p 和 #password# 之间
因此需要:
mysql -u mike -pmypass
否则 -p mypass mysql 将 'mypass' 作为 db 名称
【讨论】:
或:mysql -u usrname -p -- 这会阻止任何人看到密码,因为它会删除一个新行并要求输入密码而不显示它 很好的答案@mstram 这个解决方案很舒服,但是输入密码显然是不安全的,但不需要输入授予权限和定义其他东西。所以如果你的 mac 书是安全的——这种方法非常舒服,我更用它来将数据从 docker mysql 驱动程序导入到 aws。【参考方案7】:如果您忘记密码或想修改密码。您可以按照以下步骤操作:
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> 更新用户设置密码=password('root123') where user='root'; 查询正常,3 行受影响(0.00 秒) 匹配行:3 更改:3 警告:0
6:冲洗
mysql> 刷新权限;
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
【讨论】:
这对我有帮助,但在 Mac 上,如果您使用自制软件安装它是mysql.server stop
。就我而言,我无法更新用户列,因为没有;也无法创建一个,因为它处于安全模式。对于我现在正在做的事情,我不在乎,但我非常感谢这种格式的答案,其中显示了准确的输入和输出。谢谢!
对不起,我之前没用过mac,所以帮不了你。
谢谢你,这对我非常有用,你拯救了我的日日夜夜:)【参考方案8】:
我有一个类似的问题 - 在我第一次尝试进入 MySQL 时,root
,它告诉我访问被拒绝。原来我忘了使用sudo
...
所以,如果您在root
第一次尝试失败,请尝试:
sudo mysql -u root -p
然后输入您的密码,这应该可以。
【讨论】:
【参考方案9】:让自己免于头疼...您的问题可能是您缺少密码周围的引号。至少那是我绕道了 3 个小时的情况。
[client]
user = myusername
password = "mypassword" # <----------------------- VERY IMPORTANT (quotes)
host = localhost
http://dev.mysql.com/doc/refman/5.7/en/option-files.html
搜索“这是一个典型的用户选项文件:”并查看他们在其中陈述的示例。祝你好运,我希望能为别人节省一些时间。
【讨论】:
谢谢你。我在这上面浪费了半天的时间,而密码周围的愚蠢引号起到了作用! 哈哈。当它发生在我身上时,我几乎浪费了同样的东西。很高兴能帮上忙。 是的。这在 laravel .env 文件中也发生在我身上。没有报价,也没有工作。谢谢。 :)【参考方案10】:解决方法是删除匿名(Any)用户!
我在其他人设置的服务器上也遇到了同样的问题。我通常不会在安装 MySQL 时选择创建匿名用户,所以没有注意到这一点。最初,我以“root”用户身份登录并创建了几个“普通”用户(也就是仅在 dbs 上具有权限的用户,其用户名作为前缀),然后注销,然后继续验证第一个普通用户。我无法登录。既不是通过phpMyAdmin,也不是通过shell。原来,罪魁祸首就是这个“Any”用户。
【讨论】:
【参考方案11】:我为自己找到的最佳解决方案是。
我的用户是声纳,每当我试图从外部或其他机器连接到我的数据库时,我都会收到错误
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';
【讨论】:
【参考方案12】:两者之间的区别:
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;
【讨论】:
授权语句返回错误。我需要像这样指定一个数据库:将 newdb.* 上的所有权限授予 ....【参考方案13】:好的,我不确定,但可能这是mysql安装目录中的my.cnf文件是罪魁祸首。 注释掉这一行,问题可能就解决了。
bind-address = 127.0.0.1
【讨论】:
更多详情,您也可以查看wiki.bitnami.org/Components/MySQL 我很确定这不是问题所在。如果是这样,MySQL 会拒绝来自 127.0.0.1 以外的任何主机的连接,并且您不会收到 SQL 'Access Denied' 错误。【参考方案14】:不确定其他人是否会觉得这有帮助,但我遇到了同样的错误,并到处搜索任何匿名用户……但没有。问题最终是用户帐户设置为“需要 SSL” - 我在 PHPMyAdmin 中通过转到用户帐户并单击用户的编辑权限来找到它。一旦我取消选中此选项,一切都按预期工作!
【讨论】:
【参考方案15】:更新:在 v8.0.15(可能是这个版本)上,PASSWORD()
功能不起作用。
你必须:
-
确保首先停止 MySQL。
在安全模式下运行服务器并绕过特权:
sudo mysqld_safe --skip-grant-tables
登录:mysql -u root
mysql>UPDATE mysql.user SET authentication_string=null WHERE User='root';
mysql>FLUSH PRIVILEGES;
mysql> exit;
再次登录:mysql -u root
mysql>ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
【讨论】:
【参考方案16】:只是想让你知道一个不寻常的情况,我收到了同样的错误。也许这对将来的某人有所帮助。
我开发了一些基本视图,在开发站点创建并将它们转移到生产站点。那周晚些时候,我更改了一个 PHP 脚本,突然出现错误,即用户'local-web-user'@'localhost'的访问被拒绝。数据源对象没有改变,所以我专注于 MySQL 中的数据库用户,同时担心有人入侵了我的网站。幸运的是,该网站的其余部分似乎没有受到伤害。
后来证明,观点是罪魁祸首。我们的对象传输是使用另一个(和远程:admin@ip-address)用户而不是本地网站用户完成的。因此,视图是使用 'admin'@'ip-address' 作为定义者创建的。视图创建 SECURITY 默认为
SQL SECURITY DEFINER
当 local-web-user 尝试使用视图时,它偶然发现定义者缺乏使用表的权限。一旦安全性更改为:
SQL SECURITY INVOKER
问题已解决。根据错误消息,实际问题与预期完全不同。
【讨论】:
这最终也成为了我的问题的根源——缺少“定义器”的视图。找出这是否发生在您身上的一种快速方法是尝试以 root 身份查询同一个表或视图 - 如果这样做,错误消息将更改为更具描述性的“错误 1449 (HY000):用户指定为定义器不存在”。【参考方案17】:当您的密码包含一些特殊字符(如@、$ 等)时也会发生这种情况。 为避免这种情况,您可以将密码用单引号括起来:
$ 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>
【讨论】:
这确实是个问题(对我来说就是这样)。我所有帐户的所有密码都是使用pwgen
生成的。今天我为 MySQL 数据库及其用户生成了一个新的。不幸的是,密码包含一个反斜杠“\”,我没有将其识别为错误来源(我什至没有想到这一点)。所以,我搜索了几个小时的解决方案。在绝望中将密码设置为“123”后,登录终于成功了。 ... 用户应该注意,一些特殊字符可能会导致问题,因为 MySQL 不会在使用密码时显示任何警告,例如“daiy4ha4in7chooshuiphie\Th*aew”。
如果它还没有出现,我正准备把它作为答案发布,它在列表中太远了,我没注意到(所以我把它加了+1)跨度>
【参考方案18】:
对我来说,这个问题是由 MySQL 5.7.2 的一个新特性引起的:user
条目如果plugin
字段为空,则忽略。
将其设置为例如mysql_native_password
重新启用它们:
UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;
请参阅“身份验证说明”下的the release notes for MySQL 5.7.2。
由于某种原因(可能是因为我的 4.1 之前的密码哈希被删除了),mysql_upgrade
脚本没有设置默认插件值。
我注意到/var/log/mysql/error.log
中的以下警告消息后发现:
[警告] 用户条目 'foo'@'%' 的插件值为空。该用户将被忽略,任何人都无法再使用该用户登录。
我在这里发布这个答案可能是为了避免有人像我一样使用同样荒谬的时间。
【讨论】:
【参考方案19】:我发现了另一种表面上看起来是边缘情况的情况;我可以以 root 身份通过 SELECT INTO .. OUTFILE 导出到文件系统,但不能以普通用户身份导出。虽然这可能是权限问题,但我已经看过了,并没有看到特别明显的东西。我只能说,以对相关数据库拥有所有权限的普通用户身份执行查询会返回导致我进入该主题的拒绝访问错误。当我在一个旧项目中找到成功使用 SELECT INTO ... OUTFILE 的记录时,我注意到我是以 root 身份登录的。果然,当我以 root 身份登录时,查询按预期运行。
【讨论】:
【参考方案20】:调试总结
检查拼写错误:用户名或密码。 检查主机名并将其与 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 用户在 MySQL 中的访问被拒绝。
【讨论】:
【参考方案21】:我希望你还没有因为删除 mysql 中的 debian-sys-maint 用户而造成更大的损失
让您的 mysql 守护程序以正常方式运行。如下图所示启动你的mysql客户端
mysql -u debian-sys-maint -p
在另一个终端中,cat
文件 /etc/mysql/debian.cnf
。该文件包含密码;在提示输入密码时粘贴该密码。
http://ubuntuforums.org/showthread.php?t=1836919
【讨论】:
【参考方案22】:我遇到了类似的问题,因为我的密码包含“;” char 在我第一次创建密码时破坏了我的密码。如果对您有帮助,请谨慎行事。
【讨论】:
与@Chiwda 问题相同!有时它只是密码本身【参考方案23】:这可能适用于极少数人,但在这里。不要在密码中使用感叹号!
。
我在使用 MariaDB 时遇到了上述错误。当我将它简化为数字和字母时,它起作用了。 @
和 $
等其他字符可以正常工作 - 我在同一实例的不同用户中使用了这些字符。
address 的第五个回复引导我解决问题。
【讨论】:
是的,这是真的,我的密码是数字、字母和这些字符-::)(&/&\)/
的混合体,猜猜看,是反斜杠导致了我的问题!【参考方案24】:
现在!解决方案:
MySQL ERROR 1045 (28000): Access denied for user 'user'@'localhost' (使用密码:YES);
Wampserver 3.2.0 新安装或升级
可能xamp
使用mariaDB
作为默认值。
Wamp
服务器自带mariaDB
和mysql,默认安装mariaDB
在3306端口,mysql在3307,有时是3308端口。
连接到mysql
!
在安装时它要求使用mariaDB
或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/
【讨论】:
请不要使用反引号来强调。它们应该只用于代码。 MySQL 或 Wampserver 之类的词不是代码。Right Click wampmanager->Tools->Invert Default DBMS
将允许您将 MySQL 或 mariaDB 设为默认值(使用端口 3306 的那个)这样您就不必在您的代码中添加在实时移动时不起作用的内容。
【参考方案25】:
在 Windows 上,解决方法如下:
ERROR 1045 (28000): 用户 'root'@'localhost' 的访问被拒绝(使用密码:否)
-
从控制面板卸载mysql
从
C:\Program Files,C:\Program Files (x86)
和C:\ProgramData
中删除MySql 文件夹
安装mysql
【讨论】:
尝试了所有其他答案,终于决定尝试一下,它成功了!【参考方案26】:对我来说,root 有一个默认密码
我使用ALTER USER 'root'@'localhost' IDENTIFIED BY 'new Password';
更改了密码,并且成功了
【讨论】:
我收到一个错误ERROR 1396 (HY000): Operation ALTER USER failed for 'user'@'localhost'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)【参考方案27】:
当您运行mysql -u bill -p
时,localhost
被解析为您的 ip,因为它是 127.0.0.1 并且在您的 /etc/hosts
文件中,默认情况下存在 127.0.0.1 localhost
。因此,mysql 将您解释为 bill@localhost
,而 bill@'%'
未授予。这就是为什么root
用户在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
,您应该调用命令grant all privileges on *.* to bill@localhost identified by 'billpass';
。在这种情况下,您将能够使用命令mysql -u bill -p
登录。登录后,select user();
命令返回bill@localhost
。
但这仅适用于您尝试在同一主机上登录 mysql 服务器。在远程主机上,mysql 的行为符合预期,'%' 将授予您登录权限。
【讨论】:
【参考方案28】:我通过删除旧的错误用户'bill'条目解决了这个问题(这是重要的部分:来自 mysql.user 和 mysql.db),然后创建和之前sad一样的用户:
FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;
工作,用户正在连接。现在我将删除它的一些previlegies :)
【讨论】:
【参考方案29】:我遇到了同样的错误。无效的设置如下:
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 环境上测试我的应用程序时,出现了这个错误。
【讨论】:
【参考方案30】:如果 MySQL 在不区分大小写的操作系统(例如 Windows)上运行,也可能发生这种情况。
例如我发现尝试使用这些凭据连接到数据库失败:
mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';
$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105
错误 1045 (28000):用户 'specialuser'@'10.0.1.113' 的访问被拒绝(使用密码:YES)
但是,这成功了:
mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';
$ mysql -specialuser' -h10.300.300.400 databaseV105 -p
输入密码:
【讨论】:
以上是关于MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (使用密码: YES)的主要内容,如果未能解决你的问题,请参考以下文章
mysql ERROR 1045 (28000): 错误解决办法
mysql ERROR 1045 (28000): 错误解决办法
mysql登录时,ERROR 1045 (28000): 错误解决办法