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


429

首先,我要提一提的是,我经历了许多建议的问题,但都没有找到答案。这是我在做什么。

我已连接到我的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'的访问被拒绝(使用密码:是)



6
好吧,我尝试了这个没有成功。还有其他建议。
阿里

1
您正在运行什么版本的服务器?我已经看到5.1在这方面的表现很奇怪。
Poodlehat 2012年

2
在安装Magento时这发生在我身上,我犯了一个愚蠢的错误。把“MySQL的-u Magento的Magento的-p”是提示我输入密码和而不是默认的密码,我在把root的密码。
AmirHd

2
不幸的是,@ authentictech,在发布此问题时,没有建议的解决方案对我有用。请查看我自己的答案,这有助于我摆脱这种情况。这就是我没有将其中任何一个标记为答案的原因。可能我可以将评分最高的答复标记为答案。
阿里

Answers:


441

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

按照手册

当可能有多个匹配项时,服务器必须确定要使用哪个匹配项。它可以解决此问题,如下所示:(...)

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

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

因此,这样的匿名用户会像“ '[any_username]'@'%'从” 连接时那样“屏蔽”任何其他用户localhost

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

推荐的解决方案是删除该匿名用户(无论如何通常这样做是一件好事)。


下面的编辑与主要问题无关。这些仅用于回答此主题中其他注释中提出的一些问题。

编辑1

'bill'@'%'通过套接字进行身份验证。

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

    mysql> SELECT用户,主机FROM mysql.user;
    + ------ + ----------- +
    | 用户| 主机|
    + ------ + ----------- +
    | 帐单| %|
    | 根| 127.0.0.1 |
    | 根| :: 1 |
    | 根| 本地主机|
    + ------ + ----------- +
    设置4行(0.00秒)

    mysql> SELECT USER(),CURRENT_USER();
    + ---------------- + ---------------- +
    | USER()| CURRENT_USER()|
    + ---------------- + ---------------- +
    | bill @ localhost | 帐单@%|
    + ---------------- + ---------------- +
    设置1行(0.02秒)

    mysql>显示变量,例如“ skip_networking”;
    + ----------------- + ------- +
    | 变量名| 价值|
    + ----------------- + ------- +
    | skip_networking | 开|
    + ----------------- + ------- +
    设置1行(0.00秒)

编辑2

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

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

    mysql> CREATE USER``@'localhost'由'anotherpass'标识;
    查询正常,受影响的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 --protocol = TCP
    错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:是)
    root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = 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 |
    + ---------------- + ---------------- +
    设置1行(0.01秒)

结论1,来自编辑1:可以'bill'@'%'通过套接字进行身份验证。

结论2,摘自编辑2:无论是通过TCP还是通过套接字进行连接,都不会对身份验证过程产生任何影响('something'@'localhost'显然,除了通过套接字以外,其他任何人都无法进行连接)。

结论3,来自编辑3:尽管我指定了-ubill,但我已经被授予匿名用户访问权限。这是由于上面建议的“排序规则”。请注意,在大多数默认安装中,存在无密码的匿名用户(并且应予以保护/删除)。


9
对于像我一样好奇为什么'bill'@'localhost'匹配'@'localhost'的任何人来说,空字符串有效地充当MySQL身份验证算法中的通配符。
院长或

2
@Sanja使用此替代方法时要格外小心。您可能允许从任何位置匿名访问数据库。如有疑问,我宁愿删除该用户。
2013年

7
@RandomSeed谢谢您的评论!可能我应该删除匿名用户。PS我发现dev.mysql.com/doc/refman/5.1/en/default-privileges.html表示可以删除这些用户:DROP USER ''@'localhost';。出于某些特殊目的不需要它们。
亚历克斯

1
我删除了匿名用户,但仍然无法正常工作。然后,我发现我还需要签发“冲洗特权”。提及这一点也是有帮助的。
Neeme Praks

2
这就是答案!为什么在每本mysql手册中都没有使用粗体大写字母。删除匿名用户,否则它将试图从本地主机登录!
谢尔盖

140

尝试:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
这是非常危险的,如果有人破解您的bill @ localhost mysql帐户,那么他将拥有对mysql服务器所有数据库的无限访问权限。
Adonis K. Kakoulidis 2014年

2
乳清 我必须在用户'myusername'@'myhost.static.myip.com'周围加上引号,然后它才能工作。
bentecko 2014年

这对我有用,但恐怕我为用户提供了太多特权
Csaba Toth 2014年

1
@CsabaToth,您要做的是,再次降低特权,直到您的用户拥有了他所需要的东西为止。
jwenting 2015年

...,如果这给您“用户'root'@'localhost'的访问被拒绝(使用密码:是)”,您该怎么办?
Grunion Shaftoe

75

当你跑

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>

OK,请看我以匿名用户身份登录:

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客户端的协议。


1
'bill'@'localhost'应该匹配'bill@%',不是吗?
RandomSeed 2012年

@Yak的排序顺序并非仅基于mysql.user的用户列。MySQL本身不进行任何字符匹配。我在DBA StackExchange中
RolandoMySQLDBA 2012年

@YaK这就是我特别提到的原因SELECT USER(),CURRENT_USER();。您几乎永远不会看到匿名用户从这两个功能中出现,除非设置确实很差。
RolandoMySQLDBA 2012年

1
我从不认为排序顺序基于mysql.user。实际上,如果您再次阅读我的答案,您会发现我说过(实际上是手册说的)排序顺序首先是基于该host列的。您写了很多有关如何检查当前凭据的信息,但是关于为什么'bill'@'localhost'不能以身份登录的信息很少'bill'@'%',这就是今天的AFAIK问题。OP的设置可能不正确,这就是为什么他遇到这些错误的原因。
RandomSeed 2012年

2
--protocol=TCP是关键。非常感谢你!
lfx 2014年

22

超级晚了

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


mysql -u root -p

只需按[ENTER]输入密码即可。


一旦我做到了,它就会起作用。希望这对某人有帮助。


18

在我的情况下,一个相关的问题是尝试使用连接:

mysql -u mike -p mypass

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

因此需要:

mysql -u mike -pmypass

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


1
或:mysql -u usrname -p -这将阻止任何人看到密码,因为它将删除新行并要求密码而不显示该密码

好答案@mstram
Arpit Solanki

1
这个解决方案很舒适,但是显然键入密码并不安全,但是不需要类型授予特权和定义其他内容。因此,如果您的Mac书是安全的–这种方法非常舒适,甚至我将其用于从docker mysql驱动程序将数据导入到AWS中。
dimpiax

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地址。


“'bill'@'%'只匹配TCP / IP连接”这是错误的。使用skip-networking
RandomSeed 2012年

@YaK我无法让'user'@'%'在这样的设置下运行,这是什么意思?
2012年

我可以在不联网的情况下在v5.0上以'bill'@'%'身份连接(因此,通过套接字)。您使用什么版本?我将在v5.5上尝试。
RandomSeed 2012年

请查看我更新的答案。我能够'bill'@'%'通过v5.5上的套接字登录。
RandomSeed 2012年

17

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

1:停止您的mysql

[root @ maomao〜]#服务mysqld stop
停止MySQL:[OK]

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 Database更快地启动

5:修改密码,新密码应在“()”中输入

mysql>更新用户设置password = password('root123'),其中user ='root';
查询正常,受影响的3行(0.00秒)
匹配的行:3已更改:3警告:0

6:齐平

mysql>刷新权限;

7:退出

mysql>退出
再见

8:重启mysql

[root @ cy400〜]#服务mysqld重新启动;
停止MySQL:[确定]
启动MySQL:[确定]

宾果!您可以使用您的用户名和新密码连接数据库:

[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

1
这对我有所帮助,但在Mac上,如果您使用homebrew进行安装,则为mysql.server stop。就我而言,由于没有列,因此无法更新user列。也无法创建一个,因为它处于安全模式。我现在不在乎我在做什么,但是我非常感谢这种格式的答案,其中显示了确切的输入和输出。谢谢!
szeitlin

对不起,我以前从未使用过mac。所以我帮不了你。
李英俊

15

避免出现严重的头痛...您的问题可能是您缺少密码周围的引号。至少我的情况使我绕了3个小时。

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

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

搜索“这是一个典型的用户选项文件:”,然后查看其中的示例。祝您好运,我希望可以节省一些时间。


1
这次真是万分感谢。我在此浪费了半天,而密码周围的愚蠢引号却起到了作用!
guyfromfl

哈哈。发生在我身上时,我几乎浪费了很多。很高兴有帮助。
mimoralea

12

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

在其他人设置的服务器上,我也遇到了同样的问题。我通常不选择在安装MySQL时创建匿名用户,因此没有注意到这一点。最初,我以“ root”用户身份登录,并创建了几个“普通”用户(又名仅在以用户名作为前缀的数据库上具有特权的用户),然后注销,然后继续验证第一个普通用户。我无法登录。既无法通过phpMyAdmin,也无法通过Shell。原来,罪魁祸首是这个“任何”用户。


11

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

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

sudo mysql -u root -p

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


6

我为自己找到的最佳解决方案是。

我的用户声纳很高,每当我尝试从外部或其他计算机连接到我的数据库时,都会收到以下错误消息:

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

另外,当我从另一台机器尝试通过詹金斯工作时,我的访问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';

4

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

bind-address = 127.0.0.1

1
有关更多详细信息,您也可以查看此页面wiki.bitnami.org/Components/MySQL
Ali

1
我很确定这不是问题。如果是这样,MySQL将拒绝来自除127.0.0.1之外的任何主机的连接,并且您将不会收到SQL“访问被拒绝”错误。
The Pellmeister

3

只是想让您知道我收到相同错误的异常情况。也许这对将来的人有帮助。

我已经开发了一些基本视图,并在开发站点上创建了这些视图,并将其转移到了生产站点。那周晚些时候,我更改了一个PHP脚本,突然出现了一个错误,用户'local-web-user'@'localhost'的访问被拒绝。数据源对象没有更改,因此我专注于MySQL中的数据库用户,与此同时担心有人入侵了我的网站。幸运的是,该站点的其余部分似乎没有受到损坏。

后来发现,意见是罪魁祸首。我们的对象传输是使用与本地网站用户不同的另一个(和远程:admin @ ip-address)用户完成的。因此,使用“ admin” @“ ip-address”作为定义器创建了视图。视图创建的SECURITY默认为

SQL SECURITY DEFINER

当本地网络用户尝试使用视图时,会偶然发现缺少定义器使用表的特权。将安全性更改为:

SQL SECURITY INVOKER

问题已解决。实际问题与基于错误消息所预期的完全不同。


1
这最终也是我问题的根源-缺少“定义器”的视图。一种快速的方法来找出是否发生这种情况是尝试以根用户身份查询同一张表或视图-如果这样做,错误消息将变为更具描述性的“错误1449(HY000):用户指定为定义者不存在”。
约书亚·戴维斯

3

之间的区别是:

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;

grant语句返回错误。我需要这样指定一个数据库:将newdb。*的所有特权授予...。–
LeBird

3

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

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

3
这确实可能是一个问题(对我而言)。我的任何帐户的所有密码都是使用生成的pwgen。今天,我为MySQL数据库及其用户生成了一个新数据库。不幸的是,密码中包含一个反斜杠“ \”,我没有将其识别为错误源(我什至没有想到)。因此,我搜寻了数小时的解决方案。绝望地将密码设置为“ 123”后,登录终于可以了。…用户应注意,某些特殊字符可能会引起问题,因为MySQL不会在使用“ daiy4ha4in7chooshuiphie \ Th * aew”之类的密码时显示任何警告。
Arvid,

1
如果还没有出现,将要发布它作为答案,这简直太遥远了,我没注意到(所以我将其提高了+1)
Assimilater

3

对我而言,此问题是由MySQL 5.7.2的新功能引起的:如果user条目的字段为空,则将其忽略plugin

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

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

请参见“身份验证说明”下的MySQL 5.7.2发行说明

由于某种原因(可能是因为删除了我的4.1之前的密码哈希值),mysql_upgrade脚本未设置默认插件值。

我通过注意以下警告消息而发现/var/log/mysql/error.log

[警告]用户条目'foo'@'%'的插件值为空。该用户将被忽略,没有人可以使用该用户登录。

我在这里发布此答案,也许可以节省某人避免像我那样花费大量的时间。


2

不知道其他人是否会对此有所帮助,但是我遇到了相同的错误,并在各处搜索了任何匿名用户……而且没有任何人。问题最终是用户帐户被设置为“ Require SSL”(我在PHPMyAdmin中找到),方法是转到“用户帐户”,然后单击该用户的“编辑权限”。一旦取消选中此选项,一切都会按预期进行!


2

调试摘要

  • 检查拼写错误:用户名或密码。
  • 检查主机名,并将其与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错误代码1045用户在MySQL中拒绝访问的问题。


2

我希望您也不要通过删除mysql中的debian-sys-maint用户造成更大的损害

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

mysql -u debian-sys-maint -p

在另一个终端中,cat文件/etc/mysql/debian.cnf。该文件包含一个密码。提示时粘贴该密码。

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


2

我发现表面上出现的另一种情况是边缘情况。我可以通过SELECT INTO .. OUTFILE以root身份导出到文件系统,但不能以常规用户身份导出。尽管这可能是权限问题,但我已经看过了,没有发现特别明显的地方。我所能说的是,以对相关数据库具有所有权限的普通用户身份执行查询,将返回导致该主题的拒绝访问错误。当我在一个旧项目中找到成功使用SELECT INTO…OUTFILE的记录时,我注意到我是以root用户身份登录的。果然,当我以root身份登录时,查询按预期运行。


1

更新:在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';

0

运行时mysql -u bill -plocalhost解析为您的ip,因为它是127.0.0.1,并且在您的/etc/hosts文件中,默认127.0.0.1 localhost存在。因此,mysql将您解释bill@localhost为不被授予bill@'%'。这就是为什么查询root结果中有2个不同的用户记录的原因select host, user from mysql.user;

有两种方法可以解决此问题。

一种是指定一个IP,/etc/hosts当您尝试登录时该IP不被文件反向解析。例如,服务器的ip是10.0.0.2。运行命令时mysql -u bill -p -h 10.0.0.2,您将能够登录。如果您键入select user();,您将得到bill@10.0.0.2。当然,您不应将任何域名解析为该IP/etc/hosts文件中。

其次,您需要为此特定域名授予访问权限。为此bill@localhost,您应该调用command grant all privileges on *.* to bill@localhost identified by 'billpass';。在这种情况下,您将可以使用command登录mysql -u bill -p。登录后,select user();命令返回bill@localhost

但这仅是您尝试在同一主机上登录mysql服务器的原因。从远程主机,mysql的行为正常,'%'将授予您登录权限。


0

我通过删除旧的有问题的用户“帐单”条目(这是重要的部分:来自mysql.usermysql.db)来解决此问题,然后创建了与sad相同的用户:

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

工作正常,用户正在连接。现在,我将删除其中的一些特权:)


0

我遇到了同样的错误。无效的设置如下:

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

区别在于双引号。与PHP相比,它们在PHP中似乎非常重要,并且在转义字符,设置URL以及现在将参数传递给函数时会产生影响。它们比较漂亮(我知道),但始终尽可能使用单引号,然后在必要时可以将双引号嵌套在其中。

当我在与Windows环境相对的Linux机器上测试我的应用程序时,出现此错误。


0

我遇到了类似的问题,因为我的密码包含“;” 我在第一时间创建密码时会破坏密码。小心是否可以帮助您。


0

这可能只适用于极少数人,但这是可行的。不要!在密码中使用感叹号。

我做到了,并使用MariaDB收到上述错误。当我将其简化为仅数字和字母时,它可以工作。其他字符,例如@$可以正常工作-我在同一实例上的其他用户中使用了这些字符。

地址的第五次答复使我得以解决。


0

在Windows上,以下是解决方法:

错误1045(28000):用户'root'@'localhost'的访问被拒绝(使用密码:NO)

  1. 从控制面板上卸载mysql
  2. C:\Program Files,C:\Program Files (x86)和删除MySql文件夹C:\ProgramData
  3. 安装mysql

尝试了所有其他答案,最后下定决心尝试此方法,它成功了!
jasonoriordan '18年

0

如果MySQL在不区分大小写的OS(例如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'的访问被拒绝(使用密码:是)

但是,这成功了:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

输入密码:



0

如今!解决方案:

MySQL错误1045(28000):对用户'user'@'localhost'的访问被拒绝(使用密码:是);

Wampserver 3.2.0新安装或升级

可能xamp使用mariaDB默认值是很好的。

Wamp服务器附带了mariaDBmysql,mariaDB默认安装在3306端口上,而mysql安装在3307端口上,有时是3308端口。

连接到mysql

在安装时,它要求使用mariaDBMySql,但是mariaDB被默认选中,您无法更改它,选中mysql选项并安装。

安装完成后,两者都将mariaDB在默认端口3306上运行,并且mysql另一个端口3307或3308上运行。

右键单击wampserver图标应在右下角运行的位置,转到工具,然后查看正确的图标mysql运行端口。

并将其包含在您的数据库连接中,与folowng相同:

$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这样的词不是代码。
达曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.