MySQL:插件 'mysql_native_password' 未加载

MySQL:插件 'mysql_native_password' 未加载

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

在libera:#mysql中,一个用户在docker容器中运行mysql:latest版本的MySQL。容器自动升级到MySQL 9.0.0,删除了mysql_native_password插件。用户无法登录数据库,没有备份和副本。通过docker重现问题并恢复实例。使用LVM2和XFS文件系统创建10GB测试文件系统,挂载到/a目录。验证插件为即将被弃用的mysql_native_password。升级到8.0和8.4版本时遇到认证方法不再被识别的问题。通过创建恢复my.cnf文件解决问题,并执行恢复操作。演示使用ALTER USER语句升级认证方法为caching_sha2_password。演示创建具有完整权限的其他用户。容器现在可以通过root用户从内部和外部访问。

🔎

延伸解读

自动升级至创新版本的风险

文章中的用户使用 mysql:latest 标签,容器自动升级到 MySQL 9.0.0 创新版本,导致 mysql_native_password 插件被移除,无法登录。这提醒我们,在生产环境中应避免使用 latest 标签,而应固定具体版本,并关注 MySQL 的版本发布策略:创新版本可能引入不兼容变更,而长期支持版本更稳定。

升级前必须升级认证插件

从 MySQL 5.7 升级到 8.0 时,mysql_native_password 仍被支持,但已被弃用;升级到 8.4 时,该插件不再被识别,导致登录失败。因此,在升级到 8.4 或更高版本之前,应使用 ALTER USER 语句将用户认证插件改为 caching_sha2_password,避免升级后无法访问。

无备份时的紧急恢复方法

当因插件缺失无法登录且没有备份时,文章演示了通过 skip_grant_tables 配置启动 MySQL 进行恢复。具体步骤包括:将 my.cnf 复制到数据目录并修改,添加 skip_grant_tables 到 [mysqld] 段,然后通过卷映射覆盖容器内配置。启动后无需密码即可登录,执行 FLUSH PRIVILEGES 后即可修改用户认证方式。

认证插件迁移与用户管理

恢复过程中,使用 ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'cookie' 将认证插件升级。同时可以创建新用户并授予全部权限,例如 CREATE USER 'newroot'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'cookie',再执行 GRANT ALL ON *.* TO 'newroot'@'localhost' WITH GRAN

❓

Q&A

MySQL 9.0.0中删除了哪个插件?

mysql_native_password插件在MySQL 9.0.0中被删除。

如何恢复无法登录MySQL数据库的问题?

可以通过修改my.cnf文件,添加skip_grant_tables配置来恢复登录。

在MySQL 8.4版本中,为什么无法使用mysql_native_password插件?

在MySQL 8.4版本中,mysql_native_password插件不再被识别,因此登录失败。

如何将MySQL用户的认证方法升级为caching_sha2_password?

可以使用ALTER USER语句将用户的认证方法升级为caching_sha2_password。

在Docker中如何创建MySQL测试环境?

可以通过docker命令创建MySQL容器,并挂载外部卷来设置测试环境。

如何创建具有完整权限的新用户?

可以使用CREATE USER语句创建新用户,并使用GRANT语句赋予其完整权限。

🏷️

标签

➡️

继续阅读