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

Jenkins Pipeline执行MySQL恢复失败 未识别<后的重定向内容

问题根因
  • 核心问题是mysql命令参数用法错误:-e参数的作用是直接执行紧随其后的SQL语句字符串,一旦指定该参数,MySQL不会读取标准输入传入的任何内容。你当前命令里-e后面直接拼接了prod-$dbName,MySQL直接把这个库名当成待执行的SQL文本解析,自然抛出1064语法错误。
  • 日志显示的命令片段不包含<及后续路径不是Jenkins解析问题:Jenkins的sh步骤默认开启bash的set -x调试模式,该模式打印执行记录时不会输出重定向相关语法片段,实际上重定向逻辑已经被shell正常解析,只是MySQL受-e参数影响,完全忽略了标准输入传入的SQL文件内容。
  • 额外隐患:如果用单引号包裹sh步骤的执行命令,Groovy不会对字符串内的$dbName做变量插值,会把$dbName原样传给shell,会触发变量识别失败的问题。
修复方案

导入SQL文件到指定数据库时不要使用-e参数,选择以下任意一种正确写法即可:

  1. 命令末尾直接指定目标库名,搭配输入重定向,写法最简洁:
sh("mysql -u wp-user -h xx.xx.xx.xx -pXXXYYZZ prod-${dbName} < /mnt/restore1/prod-${dbName}.sql")
  1. 用-D参数显式指定目标库,参数含义更清晰:
sh("mysql -u wp-user -h xx.xx.xx.xx -pXXXYYZZ -D prod-${dbName} < /mnt/restore1/prod-${dbName}.sql")
补充说明
  • 执行时出现的Using a password on the command line interface can be insecure是MySQL的常规安全提示,不影响任务执行,如果要消除该提示,可以将数据库账号密码配置到Jenkins凭据中,任务运行时临时生成~/.my.cnf配置文件存储认证信息,避免明文密码出现在命令行。
  • 如果一定要使用-e参数完成导入,不能用输入重定向,需要在SQL语句中调用source指令加载文件,示例写法如下,稳定性不如直接重定向,不推荐使用:
sh("mysql -u wp-user -h xx.xx.xx.xx -pXXXYYZZ prod-${dbName} -e \"source /mnt/restore1/prod-${dbName}.sql\"")

内容的提问来源于stack exchange,提问作者animorph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:48:15