MySQL存储过程Workbench运行正常但Shell调用不结束如何解决
问题排查解决步骤
1. 优先修复Shell脚本语法错误
当前Shell脚本中mysql -e参数后的SQL语句单独换行了,Shell会将其识别为独立命令,不会传递给MySQL执行,属于典型的语法问题:
# 错误写法:-e 后面的SQL单独换行 mysql -h 10.10.10.10 -P 61306 -uuser_name -pPassword DB_Name -B -e "call sp();"
修改为两种正确写法:
- 把SQL和-e参数放同一行:
mysql -h 10.10.10.10 -P 61306 -uuser_name -pPassword DB_Name -B -e "call sp();"
- 或者用反斜杠转义换行:
mysql -h 10.10.10.10 -P 61306 -uuser_name -pPassword DB_Name -B -e \ "call sp();"
第二个导出CSV的mysql命令也需要做相同修改。
2. 检查权限匹配问题
- 确认Shell脚本使用的MySQL账号
user_name具备对应库的EXECUTE存储过程执行权限,以及db1、db2库的表读写、建表、建索引权限,Workbench使用的账号和Shell使用的账号可能存在权限差异。 - 确认
/apps/data/mysqlbackup/目录的写入权限,当前执行Shell的用户是否有权限写入文件生成CSV。
3. 开启调试定位执行异常
- 在Shell脚本开头加上
set -x开启调试模式,执行脚本查看每一步的输出,确认mysql命令是否正常执行、有没有返回报错信息。 - 执行mysql命令时加上
-v参数输出执行细节,明确存储过程调用阶段是否存在报错:
mysql -v -h 10.10.10.10 -P 61306 -uuser_name -pPassword DB_Name -B -e "call sp();"
4. 修复存储过程本身的语法错误
以下问题在Workbench宽松执行模式下可能被兼容,但严格模式下会触发执行失败:
- 存储过程开头没有声明事务,直接写
COMMIT会导致自动提交模式下无事务可提交,建议在BEGIN后第一行加上START TRANSACTION;。 - 建
sp_test表时没有定义transaction_date字段,但后续建索引时用到了该字段,Workbench可能存在遗留表结构所以可以正常执行,Shell执行时先删表重建就会触发报错。 - INSERT SELECT语句中写了
account_number VARCHAR(50)这类字段类型定义,SELECT子句不需要加字段类型,只有建表时才需要,属于语法错误。 - 存储过程开头的
DELIMITER后没有指定自定义分隔符(正常应为DELIMITER //),会导致存储过程创建失败。
5. 排查锁与超时问题
如果脚本执行后卡住不结束,大概率是锁冲突:
- 执行
show processlist;查看存储过程的执行状态,是否存在Waiting for table metadata lock之类的锁等待状态,Workbench的会话可能之前持有锁未释放,导致Shell调用的会话卡住。 - 检查MySQL的
wait_timeout、interactive_timeout参数,Shell的非交互式会话超时时间可能比Workbench的交互式会话短,导致执行到一半被断开。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

