You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,避免冲突:

  1. 先把mysql-connector-java-5.1.39-bin.jar上传到Jenkins服务器的某个目录,比如$JENKINS_HOME/lib/(Windows系统对应C:\Program Files\Jenkins\lib)。
  2. 修改你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:31