解决 java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'

Last Modified: 2023/09/17

概述

今天在使用 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';
有问题吗?点此反馈!

温馨提示:反馈需要登录