问题描述
CentOS 7 系统下在 Docker 容器中运行有 MySQL 8.0,由于当前系统中的 MySQL 客户端 5.5.60 版本太低 ,导致连接服务器时出现以下的错误:
error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
因为低版本的客户端认 mysql_native_password 密码认证插件,而高版本 MySQL 服务器默认的是 caching_sha2_password,比如 MySQL 8.0。
查看 MySQL的密码认证插件
用高版本 MySQL 客户端登录进入 MySQL 服务器
用高版本的 MySQL,或者进入该 Docker 容器,登录 MySQL 服务器:
(假设 MySQL 客户端与其服务端都在同一台机器上)
mysql -h127.0.0.1 -uroot -p
查看 MySQL 服务器版本
进入 MySQL 服务器后,执行 MySQL shell 命令查看服务器的版本:
select version();
执行结果:
+-----------+
| version() |
+-----------+
| 8.0.16 |
+-----------+
1 row in set (0.00 sec)
查看默认的密码认证插件
查看当前默认的密码认证插件:
show variables like 'default_authentication_plugin';
执行结果:
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.01 sec)
由以上的命令执行结果可知,当前默认的密码认证插件为“caching_sha2_password”,此认证方式是高版本 MySQL 客户端(至少 5.7.23)才有的,由于作者可能用到 Mycli 来登录 MySQL 服务器,而 Mycli 基于低版本的客户端,所以要修改认证插件。
在 MySQL 5.6 和 5.7,默认的密码认证方式是“mysql_native_password”。而“caching_sha2_password”是 MySQL 8.0 的默认认证方式。
查看所有用户的密码认证插件
查看当前所有用户绑定的认证插件:
select host,user,plugin from mysql.user;
执行结果:
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| % | root | caching_sha2_password |
| localhost | healthchecker | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
解决方案:修改 root 用户的密码认证方式
步骤一:修改加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
步骤二:修改 root 用户的密码认证方式为 mysql_native_password
修改认证方式的同时,连同用户密码也一起修改:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
步骤三:赋予 root 用户最高权限
grant all privileges on *.* to root@'%' with grant option;
步骤四:刷新权限,使修改立即生效
flush privileges;
类似于修改 root 用户密码认证方式,去修改其他的用户也是一样的。
完成解决方案。
让 MySQL 的密码认证插件默认为“mysql_native_password”
这需要在 MySQL 的配置文件中设置,假设在 CentOS 7 系统下, MySQL 8.0 的配置文件在 /etc/my.cnf
:
cat >/etc/my.cnf<<EOF
default_authentication_plugin=mysql_native_password
EOF
设置完重启 MySQL 进程:
systemctl restart mysqld
systemctl status -l mysqld
以后新建的用户都会默认以(除非指定)“mysql_native_password”为密码认证插件。
指定用户以“mysql_native_password”为密码认证插件
在没有设置默认密码认证插件的情况下,可以在创建用户时指定认证插件为“mysql_native_password”或者“caching_sha2_password”,也可以修改用户的密码认证插件。
当然这也需要 MySQL 的版本足够高。
创建用户时指定
比如:
CREATE USER 'wordpressuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'YourPassword';
之所以是“localhost”,是因为仅允许该用户在本地登录,如果允许其远程登录,可以设置为“%”。
修改用户时指定
ALTER USER 'wordpressuser'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'new_password';
修改密码认证方式之后
注意:在这之后,将不再支持以下的权限授予语句:
grant all privileges on *.* to root@'%' identified by '123456' with grant option;
总结
本文解决了 MySQL 登录错误“error 2059: Authentication plugin ‘caching_sha2_password’ cannot be loaded”,这是密码验证插件不一致的原因。
同时,也说明了如何在创建用户时指定密码验证插件,如何修改原有用户的密码验证插件。
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com