MySQL密码问题

问题描述

MySQL8.0及以上的版本,认证方式发生了改变,虽然不影响我们使用Navicat等工具连接到数据库,但是如果本地有一些程序使用老版本的MySQL连接器(MySQL-connector)去与高版本的数据库创建连接时,大概率会爆出这么一条错误:

1
2
3
4
Your connection attempt failed for user 'root' from your host to server at localhost:3306:
Authentication plugin 'caching sha2 password' cannot be loaded:
/usr/lib/mysgl/plugin/caching sha2 password.so: cannot open sharedobject file:
No such file or directory

问题分析与解决

通过上面的报错其实我们已经能知道个大概了:在/usr/lib/mysql/plugin目录下找不到caching_sha2_password.so文件,导致无法建立从主机到服务器的连接

那么为什么没有这个文件就不能你建立连接呢?具体细节可以查看mysql8.0.4新插件caching_sha2_password官网说明,概括来说就是因为:

MySQL8.0版本启用了新的认证方式,从native_password变为了caching_sha2_password,服务端将相关插件编译进了程序,而客户端编译进了libmysqlclient,如果本地没有这个插件呢,那自然就无法使用此种验证方登陆了。

因此解决的方法有两种:

  • 一种是直接指定用户的验证方式,切回老版:

    • 通过命令行终端登录mysql(mysql -uroot -p),注意需先通过ssh或workbench登录到服务端机器上,否则会因不允许远程登录而无法连接
    • 输入ALTER USER user@localhost IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
    • 刷新数据库FLUSH PRIVILEGES;
  • 另一种彻底的,也是更安全的方式就是升级客户端,如果是其他插件升至最新版,如果是mysql-client升至8.0以上,这种方案在我们无法登录到服务端数据库的情况下是唯一解

  • 关于认证方式升级的具体原理可以参考浅谈 MySQL 新的身份验证插件 caching_sha2_password

总结

解决新老版本MySQL之间无法登陆扥提有两种解决方式,一种是切回老版的sha1认证方式,适用于开发环境、可以接触到服务端数据库的情况,另一种是升级客户端,虽然麻烦但更加安全


MySQL密码问题
https://dockingyuan.top/2022/11/29/database/mysql-passwd/
作者
Yuan Yuan
发布于
2022年11月29日
许可协议