社区王牌专栏《一问一实验: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/