MySQL后台执行慢SQL报错ERROR 1317 (70100)求助
解决MySQL后台查询因终端关闭中断的问题
我来帮你搞定这个头疼的问题!你遇到的情况其实非常典型——当你用&把MySQL命令丢到后台运行后,一旦关闭终端,系统会给后台进程发送SIGHUP(挂起)信号,MySQL客户端收到这个信号就会主动中断正在执行的查询,服务器端也就跟着触发KILL QUERY操作,导致你看到的报错。下面给你几个实用的解决方案:
方法一:用nohup让进程忽略终端挂起信号
nohup是专门用来让命令脱离终端控制、忽略SIGHUP信号的工具,即使关闭终端,进程也能继续运行。修改你的命令如下:
nohup mysql -uuser -ppassword -B -e "SELECT SUM(duration) FROM table GROUP BY userId" database > result.tsv 2>&1 &
2>&1是把错误输出(stderr)重定向到标准输出(stdout),这样查询过程中的报错信息也会写入result.tsv(或者你可以改成2>error.log单独保存错误日志);- 执行后会生成一个
nohup.out文件,默认记录命令的输出,如果你不需要可以用nohup ... > /dev/null 2>&1 &将输出丢弃。
方法二:用终端复用工具(screen/tmux)持久化会话
如果需要随时查看查询进度或者后续操作,screen或tmux是更好的选择,它们可以创建一个独立于当前终端的会话,即使关闭终端,会话里的进程依然在运行:
用screen的步骤:
- 输入
screen创建一个新会话; - 在新会话里执行你的MySQL查询命令;
- 按
Ctrl+A+D组合键“detach”(脱离)会话,此时可以安全关闭终端; - 之后重新登录服务器,输入
screen -r就能回到之前的会话,查看查询状态。
用tmux的步骤:
- 输入
tmux new -s sql_session创建一个名为sql_session的会话; - 执行MySQL查询命令;
- 按
Ctrl+B+D组合键脱离会话; - 回来时输入
tmux attach -t sql_session即可恢复会话。
方法三:用disown移除后台进程的终端关联(应急方案)
如果你已经用&启动了命令,还没关闭终端,可以用disown让进程脱离终端的控制:
- 先输入
jobs查看后台进程的job号(比如输出里的[1]+ Running ...,job号就是1); - 输入
disown %1(把%1换成你的job号),这样进程就不会收到终端的SIGHUP信号了。
注意:这个方法只能在终端还没关闭时使用,不如前两种方法稳妥。
额外注意事项
- 密码安全性:把密码直接写在命令行里有安全风险,建议创建
~/.my.cnf配置文件,内容如下:
之后执行命令就可以省略[client] user=user password=password-uuser -ppassword,直接写mysql -B -e "..." database > result.tsv即可。 - 服务器端超时设置:如果查询运行时间超过MySQL的
wait_timeout或interactive_timeout参数值,服务器会主动断开连接。可以临时在会话里设置延长超时:
执行完这条SQL后再运行你的查询语句即可。SET SESSION wait_timeout = 86400; -- 设置为1天,单位秒
内容的提问来源于stack exchange,提问作者doushichao
相关产品推荐
相关产品推荐

