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参数,选择以下任意一种正确写法即可:
- 命令末尾直接指定目标库名,搭配输入重定向,写法最简洁:
sh("mysql -u wp-user -h xx.xx.xx.xx -pXXXYYZZ prod-${dbName} < /mnt/restore1/prod-${dbName}.sql")
- 用
-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
相关产品推荐
相关产品推荐

