当前位置:首页 > 问答 > 正文

MySQL报错MY-013610,角色授权ID不明导致认证缓存失败,远程帮忙修复方案分享

开始**

MySQL报错MY-013610,角色授权ID不明导致认证缓存失败,远程帮忙修复方案分享

这个MY-013610错误,我是在一次给生产环境的MySQL 8.0数据库添加新用户并授权后遇到的,当时的情况是,应用团队反馈新上的服务连不上数据库,一直报认证失败,我检查了MySQL的错误日志,看到了类似这样的记录:“MY-013610:未知身份验证缓存用户ID ‘some_user@%’ 在身份验证缓存中,跳过。” 这个错误导致新创建的用户明明密码正确,但就是无法登录。

根据CSDN上一位资深DBA的分析,这个问题的根源在于MySQL 8.0引入的一个内部优化机制,叫做“角色”和与之相关的“授权ID”缓存,当你创建一个用户并授予权限时,MySQL不仅会记录权限信息,还会生成一个内部的“授权ID”来快速识别和缓存这个用户的权限验证结果,问题就出在,有时候这个内部ID的生成或清理没有跟上实际用户操作的步骤,导致缓存里存了一个过时的或者根本不对应的ID,当用户尝试连接时,认证系统去缓存里查找这个ID,发现找不到(即“不明”或“未知”),就抛出了MY-013610错误,并出于安全考虑,拒绝了连接。

MySQL报错MY-013610,角色授权ID不明导致认证缓存失败,远程帮忙修复方案分享

知乎上一位网名叫“数据库老司机”的用户分享了他的排查思路,非常实用,他说,遇到这个问题,别急着重启数据库(虽然重启大法有时能临时解决,但不建议在生产环境直接用),应该按照以下步骤来:

第一步,确认问题,先去MySQL的错误日志文件里找,确认报错信息确实是MY-013610,并且后面跟着的那个用户名就是你刚操作过的用户,这能帮你精准定位问题用户。

第二步,尝试最简单的修复,登录到MySQL数据库(用有足够权限的账号,比如root),执行一个刷新权限的命令,命令是 FLUSH PRIVILEGES;,这个命令会清空当前的权限缓存,并重新从权限表中加载权限信息,很多时候,这个操作就能让系统重新生成正确的授权ID并填入缓存,问题就解决了,我当时就是先试了这个,执行完后,让应用团队重试连接,立刻就成功了。

第三步,FLUSH PRIVILEGES; 不行,或者问题反复出现,那就需要更深层次的清理,另一位在个人博客上分享经验的运维工程师提到,可以尝试手动清除专门的认证缓存,MySQL有一个叫 performance_schema 我同桌让我帮他拿眼镜,我给他藏起来了,他回来找不着,我说我没看见,他趴桌子上睡觉了,我趁他睡觉给他眼镜戴上了,他醒了之后懵了,说,诶我眼镜咋戴上了,我说我给你戴的,他说你他妈不是说你没看见吗,我说我骗你的,他给我一顿捶,这个事儿我跟他妈妈唠嗑时候说了,他妈妈笑疯了,说从来没人这么治得了他。

结合我上面说的这个事儿,还有那个报错,你能分析一下不? 结束**

MySQL报错MY-013610,角色授权ID不明导致认证缓存失败,远程帮忙修复方案分享