首页 文章

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

提问于
浏览
346

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

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

30 回答

  • 5

    超级到此为止

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


    mysql -u root -p

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


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

  • 62

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

    根据the manual

    当可能存在多个匹配项时,服务器必须确定要使用哪些匹配项 . 它解决了这个问题如下:(...)当客户端尝试连接时,服务器按排序顺序查看[表mysql.user]的行 . 服务器使用与客户端主机名和用户名匹配的第一行 . (...)服务器使用排序规则,首先对具有最特定主机值的行进行排序 . 文字主机名[例如“localhost”]和IP地址是最具体的 .

    因此,当从 localhost 连接时,这样的匿名用户会"mask"任何其他用户,如 '[any_username]'@'%' .

    'bill'@'localhost''bill'@'%' 匹配,但会匹配(例如) ''@'localhost' beforehands .

    推荐的解决方案是删除这个匿名用户(这通常是一件好事) .


    以下编辑主要与主要问题无关 . 这些仅用于回答本主题中其他评论中提出的一些问题 .

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

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

    Edit 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 ,但我被授予了匿名用户的访问权限 . 这是因为上面提到的"sorting rules" . 请注意,在大多数默认安装中,a no-password, anonymous user exists(应该加以保护/删除) .

  • 14

    尝试:

    ~$ mysql -u root -p
    Enter Password:
    
    mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
    
  • -1

    当你跑

    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

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

  • 3

    我的案例中的一个相关问题是尝试连接使用:

    mysql -u mike -p mypass
    

    Whitespace 显然允许在-u#uname#之间允许但在-p和#password#之间使用 NOT

    因此需要:

    mysql -u mike -pmypass
    

    否则在-p mypass 之间有空格_ mysql需要'mypass'作为 db 名称

  • -1

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

    1:停止你的mysql [root @maomao~] #service 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数据库更改启动5:修改你的密码你的新密码应输入“()”mysql> update user set password = password('root123')where user ='root';查询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
    
  • 14

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

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

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

    搜索“这是一个典型的用户选项文件:”并查看它们在那里说明的示例 . 祝你好运,我希望能节省一些时间 .

  • 2

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

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

  • 0

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

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

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

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

    bind-address = 127.0.0.1
    
  • -1

    只是想让你知道一个不寻常的情况,我收到了同样的错误 . 也许这有助于未来的某些人 .

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

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

    SQL SECURITY DEFINER
    

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

    SQL SECURITY INVOKER
    

    问题得到了解决 . 实际问题与基于错误消息的预期完全不同 .

  • 0

    这是一个区别:

    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;
    
  • 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>
    
  • 12

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

  • 12

    对我来说,这个问题是由MySQL 5.7.2的一个新功能引起的:如果 user 字段为空,则忽略 user 个条目 .

    将其设置为例如 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'@'%'的插件值为空 . 用户将被忽略,任何人都无法再使用此用户登录 .

    我发布这个答案这可能是为了挽救某人使用与我相同的荒谬时间 .

  • 384

    Debugging Summary

    • 检查拼写错误:用户名或密码 .

    • 检查主机名并将其与mysql.user表主机名进行比较 .

    • 检查用户是否存在 .

    • 检查主机是否包含IP地址或主机名 .

    您很可能在工作中多次遇到此问题 . 由于输入的用户名或密码不正确,我很多时候都会遇到此问题 . 虽然这是其中一个原因,但还有很多机会可能会遇到这个问题 . 有时,它看起来非常相似,但是当你深入挖掘时,你会发现导致这个错误的多种因素 . 这篇文章将详细解释,解决这个问题的大多数常见原因和解决方法 .

    Possible reasons:

    • Case 1: Typo error: username or password.

    这是此错误的最常见原因 . 如果您错误地输入了用户名或密码,肯定会收到此错误 .

    Solution:

    这类错误的解决方案非常简单 . 只需输入正确的用户名和密码即可 . 此错误将得到解决 . 如果您忘记了密码,可以重置用户名/密码 . 如果您忘记了admin / root帐户的密码,有很多方法可以重置/重新获取root密码 . 如果忘记root密码,我将发布另一篇关于如何重置root密码的帖子 .

    • Case 2: Accessing from wrong host.

    MySQL为用户访问提供基于主机的限制作为安全功能 . 在我们的 生产环境 环境中,我们过去仅将访问请求限制为应用程序服务器 . 此功能在许多 生产环境 方案中非常有用 .

    Solution:

    遇到此类问题时,首先检查mysql.user表,检查是否允许主机 . 如果未定义,则可以将新记录更新或插入mysql.user表 . 通常,由于安全问题,禁用从远程计算机以root用户身份进行访问,这不是最佳做法 . 如果您有从多台计算机访问服务器的要求,请仅授予对这些计算机的访问权限 . 最好不要使用通配符(%)并进行通用访问 . 让我更新mysql.user表,现在demouser可以从任何主机访问MySQL服务器 .

    • Case 3: User does not exists on the server.

    当您尝试访问的用户不存在于MySQL服务器上时,会发生此类错误 .

    Solutions:

    当您遇到此类问题时,只需检查用户是否存在于mysql.user表中 . 如果记录不存在,则用户无法访问 . 如果要求该用户访问,请使用该用户名创建新用户 .

    • Case 4: Mix of numeric and name based hosts.

    Important points

    • 建议在定义用户主机时使用通配符,尝试使用确切的主机名 .

    • 禁用远程计算机的root登录 .

    • 使用代理用户概念 .

    与此主题相关的其他概念很少,并且了解这些主题的详细信息是本文的非常不同的范围 . 我们将在即将发表的文章中研究以下相关主题 .

    • 怎么办,如果忘记了MySQL服务器的root密码 .

    • MySQL Access权限问题和用户相关表 .

    • MySQL安全功能和最佳实践 .

    我希望这篇文章能帮助您修复MySQL中用户拒绝的MySQL错误代码1045访问权限 .

  • 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

  • 0

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

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

    sudo mysql -u root -p

    然后输入你的密码,这应该工作 .

  • 2

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

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

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

  • 0

    在窗口中,如何解决ERROR 1045(28000):拒绝访问用户'root'@'localhost'(使用密码:NO)

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

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

    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中非常重要而不是Java,它们在转义字符,设置URL以及现在将参数传递给函数时都会产生影响 . 它们更漂亮(我知道),但总是尽可能使用单引号,然后双引号可以嵌入其中,如果有必要的话 .

    当我在Linux机器上测试我的应用程序而不是Windows时,出现了这个错误环境 .

  • 2

    操作系统:Windows

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

    我的理由是不用 administrator permission 打开cmd

    所以我的解决方案:用 administrator permission 打开cmd,然后就可以了 .

  • 121

    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

  • 12

    当您运行 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(); ,您将获得 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表现出预期的行为,'%'将授予您登录权限 .

  • -1

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

  • 3

    如果您使用旧版本的MySQL UI(如SQLYoug)生成具有错误哈希的密码,也会出现此问题 .

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

  • 14

    我遇到了同样的问题,但在我的情况下,解决方案是由eggyal的评论解决的 . 我也有一个匿名用户,但删除它并没有解决问题 . “FLUSH PRIVILEGES”命令有效 .

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

  • 2

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

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

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

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

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

  • -1

    在尝试访问使用具有非常长密码的compose构建的MYSQL docker容器时,我遇到了与OP相同的问题:

    # docker-compose.yml snippet
    services:
      db:
        environment:
          MYSQL_ROOT_PASSWORD: some_password_more_than_32_characters
    

    Reducing the password length并通过compose重建使我能够使用像Workbench这样的客户端访问MYSQL容器 .

相关问题