解决 java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'
概述
今天在使用 mysql 命令行工具连接 mysql 数据库的时候,报了一个 Unable to load authentication plugin 'caching_sha2_password' 的错误,上网一查发现绝大部分解决方案都是将 mysql 的认证方法改为老的认证方式 mysql_native_password ... 这和解决不了问题,就将搞问题的问题解决掉有啥区别? 本着负责的态度,本文给出正确的解决方案供大家参考。
问题的原因
查 Mysql 官方文档找到这么一段:
In MySQL 8.0, caching_sha2_password is the default authentication plugin rather than mysql_native_password.
原来是 mysql 8.0 以后默认的认证插件改成了 caching_sha2_password,该插件相较于之前的 mysql_native_password 认证插件具有更好的性能。使用 mysql 命令或者客户端(navicat 等)出现这个错误的根本原因是 mysql 客户端版本过低。
这里顺便提一句,使用命令行连接数据库的方法如下:
mysql -h <host> -u <username> -p
# 例如:连接 192.168.2.31 上的 mysql 命令如下,假设用户名 root
mysql -h 192.168.2.31 -u root -p
# 如果连接本地数据库可以省略 -h
mysql -u root -p
既然知道了问题所在,解决也就很简单了,接下来我们一起看下如何解决这个问题。
如何解决问题
如果使用的命令行连接数据库,可以先查看 mysql 客户端的版本,确认客户端版本,如果版本过低,可以卸载 mysql 客户端,安装较新版本的客户端。
可以使用 mysql -V
查看当前 mysql 客户端的版本。以下以 CentOS 7/RHEL 7 为例,讲解如何更新 mysql 客户端版本到 8.0。
# 移出老的 mysql 客户端
yum remove mysql
# 添加官方 repository
yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
# 使用刚添加的 repo 安装 mysql
yum --enablerepo=mysql80-community install mysql
更详细的使用方式,可以参考:A Quick Guide to Using the MySQL Yum Repository
注:这种由于 mysql 客户端版本过低连不上 mysql 服务端一般发生在本地曾经安装过一个老的 mysql 客户端版本,然后使用该 mysql 客户端版本连接远程服务器上一个高版本的 mysql(8.0以上) 数据库。
如果 Java 程序使用 Maven 管理依赖,则可以更新 mysql-connector-java 的版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.13</version>
</dependency>
不推荐的解决方式
正如在文章开头的概述中提到那样,这种解决方式不是解决问题而是“解决提出问题的人”。这种方式便是将 mysql 的认证插件从 caching_sha2_password 回退到之前的 mysql_native_password。
过程如下:先连上 mysql,然后使用 alter user 命令将修改认证方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
温馨提示:反馈需要登录