如何将MySQL认证从mysql_native_password迁移至caching_sha2_password并兼容现有应用?
迁移至caching_sha2_password认证的实现方案
目前我仅在Java应用(Spring)或bash脚本中使用
mysql_native_password认证方式,配置如下:Java应用的
application.properties:spring.datasource.username=root spring.datasource.password=rootpw原生bash脚本:
export MYSQL_PWD=rootpw; mysql --user=root --database=mytable -e "INSERT INTO mytable VALUES(...)"问题:如何将这些应用迁移为使用
caching_sha2_password认证,同时仍可通过上述账号密码组合进行身份验证?
一、MySQL端修改用户认证插件
首先需要在MySQL服务器中更新目标用户的认证插件为caching_sha2_password,同时保留原密码组合:
- 登录MySQL权限账号(如root):
mysql -u root -p
- 修改用户的认证插件(根据实际访问范围选择
%或localhost):
-- 允许远程访问的用户 ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'rootpw'; -- 仅本地访问的用户 ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'rootpw';
- 刷新权限使配置生效:
FLUSH PRIVILEGES;
二、Java(Spring)应用适配
Spring应用只需确保MySQL驱动版本支持caching_sha2_password,Connector/J 8.0及以上版本原生支持该认证方式:
- 确认依赖中的驱动版本(以Maven为例):
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 需为8.0+版本 --> </dependency>
- 原有
application.properties配置无需修改,驱动会自动适配认证方式。若遇连接报错,可在JDBC URL中添加allowPublicKeyRetrieval=true参数:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=rootpw
三、Bash脚本适配
bash中使用的mysql客户端需为8.0及以上版本,该版本已原生支持caching_sha2_password:
- 检查客户端版本:
mysql --version
- 若版本为8.0+,原脚本可直接使用,无需修改:
export MYSQL_PWD=rootpw; mysql --user=root --database=mytable -e "INSERT INTO mytable VALUES(...)"
若客户端版本低于8.0,需升级至MySQL 8.0客户端版本才能支持新认证方式。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

