MySQL ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:YES)

时间:2012-04-24 13:42:51

标签: mysql access-denied

首先让我提一下,我已经经历了许多建议的问题,并没有找到相关答案。这就是我正在做的事情。

我已连接到我的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

输入正确的密码并收到此错误:

  

ERROR 1045(28000):用户'账单'@'localhost'拒绝访问(使用密码:是)

39 个答案:

答案 0 :(得分:405)

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

根据the manual

  

当可能存在多个匹配项时,服务器必须确定哪个匹配项   他们使用。它解决了这个问题如下:(...)

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

(...)   服务器使用排序规则来排序最具体的主机值的行。   文字主机名 [例如'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
    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

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


    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中的情况相同,现在提供匿名用户的密码。


    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:可以通过套接字验证为'bill'@'%'

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

结论3,来自编辑3:虽然我指定了-ubill,但我被授予了匿名用户的访问权限。这是因为上面提到的“排序规则”。请注意,在大多数默认安装中,a no-password, anonymous user exists(并且应该加以保护/删除)。

答案 1 :(得分:131)

尝试:

~$ mysql -u root -p
Enter Password:

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

答案 2 :(得分:67)

当你跑步时

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

答案 3 :(得分:15)

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

答案 4 :(得分:14)

超级晚了

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

mysql -u root -p

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

一旦我做到了,它就有效了。希望这有助于某人。

答案 5 :(得分:14)

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

  

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>更新用户设置密码=密码(' root123')其中user =' root&#39 ;;
    查询OK,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

答案 6 :(得分:14)

我的案例中的一个相关问题是尝试使用以下方式进行连接:

mysql -u mike -p mypass

空白显然允许在-u#uname#之间,但在-p和#password#

之间

因此需要:

mysql -u mike -pmypass

否则在-p mypass 之间有空白区域mysql将'mypass'作为 db 名称

答案 7 :(得分:14)

避免一个主要问题...你的问题可能是你错过了密码周围的引号。至少那是我的情况,绕了我3个小时。

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

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

搜索&#34;这是一个典型的用户选项文件:&#34;并看到他们在那里陈述的例子。祝你好运,我希望能节省一些时间。

答案 8 :(得分:12)

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

我在其他人的服务器设置上也遇到了同样的问题。我通常不会在安装MySQL时选择创建匿名用户,所以没有注意到这一点。最初我以“root”用户身份登录并创建了几个“普通”用户(也就是用户只在dbs上使用其用户名作为前缀的权限),然后注销,然后继续验证第一个普通用户。我无法登录。既不通过phpMyAdmin,也不通过shell。事实证明,罪魁祸首是这个“任何”用户。

答案 9 :(得分:5)

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

我的用户是声纳,每当我尝试从外部或其他机器连接到我的数据库时,我都会收到错误

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

答案 10 :(得分: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>

答案 11 :(得分:3)

只是想让你知道我收到同样错误的异常情况。也许这有助于未来的人。

我开发了一些基本视图,在开发站点创建并将它们传输到生产站点。那个星期晚些时候我改变了一个PHP脚本,突然出现了一些错误,即用户&#39; local-web-user&#39; localhost&#39;拒绝访问。数据源对象没有改变,所以我专注于MySQL中的数据库用户,同时担心有人入侵了我的网站。幸运的是,网站的其余部分似乎没有受到伤害。

后来证明这些观点是罪魁祸首。我们的对象传输是使用另一个(和远程:admin @ ip-address)用户完成的,而不是本地网站用户。因此,视图是通过&#39; admin&#39; @&#39; ip-address&#39;创建的。作为定义者。视图创建SECURITY默认为

SQL SECURITY DEFINER

当local-web-user尝试使用视图时,它会发现定义者缺少使用表的权限。安全性更改为:

SQL SECURITY INVOKER

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

答案 12 :(得分: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

隐含于&#39; bill&#39; @&#39; localhost&#39;而不是&#39; bill&#39; @&#39;%&#39;。

&#39; bill&#39; @&#39; localhost&#39;

没有权限

你得到错误:

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;

答案 13 :(得分:3)

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

bind-address = 127.0.0.1

答案 14 :(得分:2)

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

因此,如果首次尝试失败,请尝试:

sudo mysql -u root -p

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

答案 15 :(得分: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中用户拒绝的MySQL错误代码1045访问权限。

答案 16 :(得分:2)

不确定是否有其他人会发现这有用,但我遇到了同样的错误并搜索了所有匿名用户...而且没有任何人。问题最终是用户帐户被设置为“要求SSL” - 我在PHPMyAdmin中找到了这一点,方法是转到“用户帐户”并单击“为用户编辑权限”。一旦我取消选中此选项,一切都按预期工作!

答案 17 :(得分:2)

对我来说,这个问题是由MySQL 5.7.2的新功能引起的:如果explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); 字段为空,则user条目被忽略

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

mysql_native_password

请参阅«身份验证说明»下的the release notes for MySQL 5.7.2

出于某种原因(可能是因为我的4.1之前的密码哈希被删除了),UPDATE user SET plugin='mysql_native_password' WHERE user='foo'; FLUSH PRIVILEGES; 脚本没有设置默认的插件值。

我在mysql_upgrade注意到以下警告消息后发现:

  

[警告]用户输入'foo'@'%'的插件值为空。用户将被忽略,任何人都无法再使用此用户登录。

我在这里发布这个答案,可能会让某人像我一样使用同样荒谬的时间。

答案 18 :(得分:2)

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

答案 19 :(得分:2)

现在!的解决方案:

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

Wampserver 3.2.0的新安装或升级

大概xamp使用mariaDB作为默认值是很好的。

Wamp服务器随附mariaDB和mysql,并在3306端口上默认安装mariaDB,在3307端口(有时为3308)上安装mysql。

连接到mysql

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

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

右键单击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/

答案 20 :(得分: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

答案 21 :(得分:0)

操作系统:Windows

我的错误消息是:“ MySQL错误1045(28000):用户'root'@'localhost'的访问被拒绝(使用密码:是)”

我的原因不是使用administrator permission

打开cmd

所以我的解决方案:使用administrator permission打开cmd,然后它可以工作。

答案 22 :(得分:0)

所以对我来说,问题与我正在映射的端口有关。

3306 => 3306 不工作(因为我有一个本地 mysql 正在运行)

3307 => 3306 有效!

这是在建立 ssh 隧道的上下文中:

ssh -N -L 3307:rdsDns:3306 ec2User@ec2Dns -i key.pem -v

3307 是本地端口,3306 是远程端口。

答案 23 :(得分:0)

对我来说,进入mysql时没有指定 view.loadUrl ("javascript:(function() { "+"document.getElementsByClassName('body')[0].style.display='none'; "+ "document.getElementsByClassName('td-fix-index ')[0].style.display='block';"+"} )()"); 参数。

-p

我没问题,但是没有密码调用mysql是错误的。

答案 24 :(得分:0)

对我来说,root用户具有默认密码

我使用ALTER USER 'root'@'localhost' IDENTIFIED BY 'new Password';更改了密码,并且有效

答案 25 :(得分:0)

我遇到了类似的问题,因为我的密码包含“;”当我在第一时间创建密码时,char破坏了密码。谨慎行事对您有帮助。

答案 26 :(得分:0)

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

答案 27 :(得分:0)

如果MySQL在不区分大小写的* OS(例如Windows)上运行,也会发生这种情况。

例如我发现尝试使用这些凭据连接到数据库失败:

mysql>将databaseV105。*上的select授予“ s3curepa5wrd”标识的“ specialuser”;

$ mysql -specialuser'-p's3curepa5wrd'-h10.61.130.89 databaseV105

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

但是成功了:

mysql>将数据库v105。*上的select授予由's3curepa5wrd'标识的'specialuser';

$ mysql -specialuser'-h10.300.300.400数据库V105 -p

输入密码:

答案 28 :(得分:0)

这可能只适用于极少数人,但是可以。请勿在密码中使用惊叹号(!)。我做到了,并使用MariaDB收到上述错误。当我将其简化为仅数字和字母时,它可以工作。其他字符(例如@和$)可以正常工作-我在同一实例上的其他用户中使用了这些字符。 address的第五次回应使我得以解决。

答案 29 :(得分: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以及现在将参数传递给函数时会产生影响。它们比较漂亮(我知道),但始终尽可能使用单引号,然后如有必要,可以将双引号嵌套在其中。

当我在Linux机器上而不是Windows环境下测试我的应用程序时出现此错误。

答案 30 :(得分:0)

在窗口中,如何解决ERROR 1045(28000):拒绝访问用户&root;&#39; @&#39; localhost&#39; (使用密码:否)

1) Uninstall mysql from control panel
2)Delete MySql folder from C:\Program Files,C:\Program Files (x86) and C:\ProgramData
3)Install mysql

答案 31 :(得分:0)

我通过删除旧的错误用户'bill'条目解决了这个问题(这是重要的部分:来自 mysql.user mysql.db ),然后创建与之前悲伤的用户相同:

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

工作,用户正在连接。现在我将从中删除一些流行病:)

答案 32 :(得分:-1)

对于Mac用户,如果他们仍有问题(就我的情况而言),我发现此解决方案对我有用:MySQL command line '-bash command not found'

要在macbook终端上使用命令,即mysql,您需要使用以下命令导出路径:

export PATH=$PATH:/usr/local/mysql/bin/

考虑默认安装,使用以下命令以root用户身份获取mysql提示符:

mysql -u root

否则您使用了错误的root密码。

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

答案 33 :(得分:-1)

当您运行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;用户有2个不同记录的原因。

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

当您尝试登录时,一个是指定/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预期行为,'%'将授予您登录。<​​/ p>

答案 34 :(得分:-1)

确保没有其他运行使用localhost帖子的SQL实例。在我们的例子中,另一个实例在与登录冲突的localhost上运行。关闭它解决了这个问题。

答案 35 :(得分:-1)

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

答案 36 :(得分:-1)

如果您使用的旧版MySQL UI(如SQLYoug)生成密码错误,也会出现问题。

使用SQL脚本创建用户将解决问题。

答案 37 :(得分:-1)

百分号表示所有ip,因此localhost是多余的...不需要本地主机的第二条记录。

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

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

'<user_name>'@'<host_name>' 您可以为主机名指定特定的IP地址或地址范围,或使用百分比字符(“%”)使该用户能够从任何主机登录。

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

答案 38 :(得分:-1)

我有同样的问题,但在我的情况下,解决方案是由eggyal的评论解决的。我也有一个匿名用户,但删除它并没有解决问题。 &#39; FLUSH PRIVILEGES&#39;命令虽然有效。

令我惊讶的是,我使用MySQL Workbench创建了用户,我希望能够执行所有必要的功能来完成任务。