社区王牌专栏《一问一实验:AI 版》全新改版归来,得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询,表达了想试用体验 ChatDBA 的意愿,对此我们表示感谢?

目前,ChatDBA 还在最后的准备阶段,会尽快跟大家见面。想预约试用的朋友,可以扫码文末的 意见反馈 填写调研问卷。我们正在对 DBA 群体试用大模型的情况进行调研,这对我们打磨 ChatDBA 的使用体验非常重要。

下面让我们正式进入《一问一实验:AI 版》的第 53 期。

问题

MySQL 创建了用户却无法登陆

用户反馈前期进行了一个升级操作:从 MySQL 5.6 升级到 5.7 后,新建了一个 sky1@% 的用户,但是通过 socket 登录报错 Access denied

实验

1. 将问题丢给 ChatDBA

我们先把这个问题丢给 ChatDBA,让他看下具体出了什么问题。

左侧为流程分析画布,展示 ChatDBA 对此问题的排查逻辑;右侧为互动区域

2. ChatDBA 协助问题排查

这个问题是说用户虽然创建了名字为 sky1 的用户,但是却登录不上去,这时 ChatDBA 给出的可能原因有:

  • 权限配置问题:没给这个用户配置 socket 登录方式
  • 数据库配置问题
  • 操作系统的权限问题
  • 匿名用户导致

ChatDBA 提示需要查询上面几处的具体信息,同时也可以看到,此时 ChatDBA 推测了一种可能得解决方案,并给出了操作步骤。

3. ChatDBA 给出解决方案

经过检查发现用户的权限等都不存在问题,但是输入用户信息表时,ChatDBA 发现确实存在匿名用户,那么他提示直接删除用户即可解决该问题。

4. 实验总结

针对该问题,ChatDBA 上述的排查步骤虽然解决了问题,但是并没有解释问题出现的根本原因。后续经过检查我们发现,当用户不输入密码的时候是可以登陆的,而且登录的用户信息如下:

mysql> select current_user();
+------------------+
*current user *
+------------------+
*@localhost *
+------------------+
1 row in set (0.00 sec)
mysql> select user();
+---------------+
* user          *
+---------------+
*sky1@localhost *
+---------------------+
1 row in set (0.00 sec)

针对这个情况我们也问了一下 ChatDBA。

他回复说其实是因为用户匹配规则导致的:

  • 使用 sky1@% 用户通过 socket 登录,host 被识别为 localhost
  •  mysql.user 表中,有两个匿名用户(''@localhost  ''@centos76)。
  • 根据 MySQL 5.6 的匹配规则,虽然有一个 sky1@% 的用户存在,但由于存在一个 ''@localhost 的匿名用户,MySQL 优先匹配这个匿名用户。
  • 由于匿名用户没有密码,当你输入 sky1@% 用户的密码时,MySQL 会因为匿名用户没有密码而拒绝访问,报错 Access denied

但是其实在 MySQL 5.7 中优化了用户匹配规则。当使用 socket 链接时,不会优先匹配到匿名用户,因此全新安装的 MySQL 5.7 不会出现这个问题。而从 5.6 升级到 5.7 的过程中,MySQL 对用户表元数据没有更新,所以导致了用户开头出现的当从 MySQL 5.6 升级到 5.7 后,新建了一个 sky1@% 的用户,但是通过 socket 登录报错 Access denied

问问 ChatGPT-4o

我们也将相同的问题送给了 ChatGPT-4o,让我们看看效果如何。

什么是 ChatDBA?

更多技术文章,请访问:https://opensource.actionsky.com/

分类: 一问一实验