连接 MySQL 8.0 时,加密方式不兼容的解决方法

现象

报错如下: “Authentication plugin ‘caching_sha2_password’ cannot be loaded”。

解决方案

问题的原因:是从MySQL8.0 开始,默认的加密规则使用的是 caching_sha2_password

  1. 首先找到当前数据库用户root的加密规则
mysql>use mysql; 
mysql>select user, host, plugin from user

  1. 修改加密规则为“mysql_native_password”
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

  注: password 替换为 root 的密码; 或者直接更新这一行 pluggin字段 的值为 “mysql_native_password”

  修改my.cnf配置文件,加入

+  default-authentication-plugin=mysql_native_password

  但是这个配置参数只对新的用户起作用,对于老的,比如root那就要重新设置一下密码

  对与那个用户使用了哪种认证插件,你可以去mysql的用户表去查看plugin字段

mysql -u root -p
use mysql
select * from user;

  接着我们修改root的认证插件

ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

  之后就好了.

  完成后效果如下:

更为优雅的解决方案

  又重新回到了 MySQL 官方在docker的仓库中,仔细的阅读了一遍官方的说明。
其实,我们在启动MySQL 容器的时候,是可以修改一些设置的。主要有2种方式。

  1. 自定义配置文件,并 mount 到 container里。这样在MySQL启动时,会加载我们的配置文件。
  2. 启动MySQL容器是传入CMD,通过命令修改默认加密规则(下面绿色部分)
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=weather_db -p 3307:3306 --name test-mysql --restart always -v  /home/ct/mysql/data:/var/lib/mysql  
mysql:8.0.12  --default-authentication-plugin=mysql_native_password