Jenkins Pipeline连接MySQL时出现CLIENT_PLUGIN_AUTH必填错误求助
解决Jenkins Pipeline连接MySQL 5.1.73时的CLIENT_PLUGIN_AUTH错误
这个问题我之前帮同事排查过,核心原因是Jenkins的database/database-mysql插件自带的高版本MySQL驱动,和你的旧版MySQL 5.1.73不兼容。高版本驱动默认要求CLIENT_PLUGIN_AUTH认证方式,但MySQL 5.1.x根本不支持这个特性,而你本地Java程序用的5.1.39驱动是适配旧版MySQL的,所以能正常连接。
下面给你几个可行的解决方案,按优先级排序:
方案1:强制加载指定版本的驱动(最推荐)
Jenkins插件自带的驱动会覆盖你手动指定的版本,所以我们需要用自定义类加载器强制加载5.1.39的驱动jar,避免冲突:
- 先把
mysql-connector-java-5.1.39-bin.jar上传到Jenkins服务器的某个目录,比如$JENKINS_HOME/lib/(Windows系统对应C:\Program Files\Jenkins\lib)。 - 修改你的Pipeline脚本,用自定义类加载器加载驱动:
import groovy.sql.Sql import java.net.URLClassLoader node { // 指向你上传的驱动jar路径 def driverJarPath = "${JENKINS_HOME}/lib/mysql-connector-java-5.1.39-bin.jar" def driverJar = new File(driverJarPath) def customClassLoader = new URLClassLoader( [driverJar.toURL()] as URL[], Thread.currentThread().contextClassLoader ) // 用自定义类加载器加载驱动 Class driverClass = customClassLoader.loadClass("com.mysql.jdbc.Driver") driverClass.newInstance() // 初始化连接,添加适配旧MySQL的参数 def dbUrl = "jdbc:mysql://localhost:3306/test?useSSL=false&authPlugins=mysql_native_password&useUnicode=true&characterEncoding=utf8" def dbConnection = Sql.newInstance( dbUrl, "username", "password", "com.mysql.jdbc.Driver", customClassLoader ) // 测试连接(可选) try { def testResult = dbConnection.firstRow("SELECT 1 AS connection_test") println("✅ 数据库连接成功:${testResult}") } finally { dbConnection.close() } }
关键参数说明:
authPlugins=mysql_native_password:明确指定旧版MySQL使用的认证插件,避免高版本驱动默认启用的caching_sha2_password(需要CLIENT_PLUGIN_AUTH)。useSSL=false:旧版MySQL默认未开启SSL,关闭后避免额外的SSL握手错误。customClassLoader:确保Jenkins用我们指定的5.1.39驱动,而不是插件自带的高版本驱动。
方案2:卸载database-mysql插件
如果你的Pipeline不需要database插件的其他功能,可以直接卸载database-mysql插件,这样Jenkins就不会自动引入高版本驱动了。之后在Pipeline里按你本地Java程序的方式写连接代码,大概率就能正常工作。
方案3:调整JDBC URL参数(仅适用于驱动版本接近5.1.39的情况)
如果不想修改类加载器,可以尝试在JDBC URL里添加更多兼容参数,但这个方法不一定能解决插件驱动冲突的问题,只能作为补充:
def dbUrl = "jdbc:mysql://localhost:3306/test?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&authPlugins=mysql_native_password"
为什么本地Java程序能正常工作?
因为本地环境里只有你指定的5.1.39驱动,没有其他版本的驱动冲突;而Jenkins的database插件会自动引入高版本的mysql-connector-java(比如8.x版本),这些高版本驱动对旧MySQL的兼容性参数默认是关闭的,所以才会抛出CLIENT_PLUGIN_AUTH错误。
内容的提问来源于stack exchange,提问作者Azhar
相关产品推荐
相关产品推荐

