首先让我提一下,我已经研究了许多建议性的问题,但没有找到相关的答案.这就是我要做的.

我已连接到我的Amazon EC2实例.我可以通过以下命令使用MySQL root登录:

mysql -u root -p

然后我用主机%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

已将所有权限授予用户bill:

grant all privileges on *.* to 'bill'@'%' with grant option;

然后我退出root用户并try 使用bill登录:

mysql -u bill -p

输入了正确的密码并出现以下错误:

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

推荐答案

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

根据the manual:

当可能存在多个匹配时,服务器必须确定

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

(...)

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

'bill'@'localhost''bill'@'%'匹配,但与''@'localhost'匹配.

建议的解决方案是删除这个匿名用户(无论如何,这通常是一件好事).


Below edits are mostly irrelevant to the main question. These are only meant to answer some questions raised in other comments within this thread.

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:可以通过插座进行身份验证.

结论2,来自编辑2:一个人是通过TCP连接还是通过套接字连接对身份验证过程没有影响(显然,除了一个人不能像其他人一样通过套接字连接外,'something'@'localhost'个人不能通过套接字连接).

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

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

LaravelEloquent ToSql()缺少连接表

递归查询意外地为一个字段返回空值

如何从MySQL数据库中提取入职第一个月的工作天数?

使用字符串文字与使用日期文字时的SQL行为

如何查询一行

查询优化并提高性能

在 mySQL 中计算每日数组的每周指标

避免多个SQL查询的重构代码

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

获取 TEXT 类型行的百分比

创建将列与多个值进行比较的索引

从 2 个不同的表中获取数据并将它们加入 sql

更改整数时间到日期格式 MM/DD/YY,如 python 中的 datetime.fromtimestamp

脚本超时,如果要完成导入,请重新提交相同的文件,导入将恢复

从mysql中的大表中快速 Select 随机行

将 JavaScript 到日期对象转换为 MySQL 日期格式 (YYYY-MM-DD)

MySQL查询/子句执行顺序

你能推荐一个免费的 Linux 轻量级 MySQL GUI 吗?