使用MySQL在后台运行SQL查询

Chr*_*Yee 7 mysql sql

有没有办法在我关闭计算机后在服务器上运行SQL查询?

我从一位同事那里听说有,她希望我这样做.我相信她说它被称为"屏幕"?

Dan*_*Dan 10

我假设您正在服务器,并希望能够关闭本地工作站.

您可以使用nohup和后台进程.了解-emysql命令的选项也很有用.

所以像这样:

nohup mysql <options> -u <user> -p <pass> -e 'Insert Query Here' &
Run Code Online (Sandbox Code Playgroud)
  • nohup 用于"不挂断",即当我断开连接时不要结束该过程.

  • mysql ...您经常运行连接的mysql命令,只需添加-e选项即可运行查询而无需打开mysql会话

  • & 在后台启动该过程

我不确定这个但是:如果你不想把密码放在命令中,运行没有密码的命令,输入fg密码提示应该回来,输入你的密码,ctrl-z将进程发回后台,然后你可以断开连接.


blu*_*ary 9

如果你发现你正在使用遇到的问题nohupmysql-我发现@ dan08的灵感的替代解决方案回答这个页面上,以及@节点的答案约把一个已经运行的进程到后台,从另一个问题上的SO.


我发现当尝试使用nohup mysql...'后台'一个长时间运行的mysql命令的建议时,我试图连接的远程MySQL服务器拒绝连接.在mysql没有前缀的情况下运行相同的命令时nohup,连接成功,mysql命令按预期工作.

因此,我寻找替代方法来实现相同的最终结果,即能够运行长时间运行的SQL命令(或一组SQL命令),而不必担心如果我从shell会话断开连接或网络问题,进程终止导致远程服务器断开连接.这项研究得出了以下提出的工作解决方案:

  1. 运行您的mysql命令,就好像您想在前台运行它一样; 例如:mysql <options> -h <host> -u <user> -p -e "source /absolute/path/to/commands.sql" <database name> 2>&1 > ./mysql_output.log
  2. 询问时,在MySQL命令提示符下输入指定的相关密码<user>(这由上面命令中包含的-p标志触发mysql).
  3. 在这种情况下,立即按Ctrl+ Z暂停当前​​进程mysql.
  4. 运行bg命令将当前挂起的进程移动到后台,然后继续处理.
  5. 运行该jobs命令以列出当前在shell会话中运行的作业(如果当前会话中没有运行任何其他后台进程,则可能只列出一个作业).从此列表中注明作业编号mysql,1如果您只运行一个作业,则可能会这样.
  6. 最后,但并非最不重要的是,运行disown -h %<job number>命令,因此disown -h %1(假设在上面的步骤#5中获得的作业号是1).最后一个命令非常重要,因为它将当前shell会话与我们mysql刚刚进入后台的进程解除关联,以便mysql在终端shell会话结束时进程不会被终止.如果没有调用disown,mysql如果您的终端会话结束,那么现在在后台运行的进程仍然会被终止.

上面的命令序列nohup mysql...通过允许您将长时间运行的调用移动mysql到后台并且如果关闭终端会话或从远程服务器断开连接而没有终止进程,则有效地模拟了调用.如果您发现运行nohup mysql...在您的环境中工作非常好,因为它肯定是更容易和更快速的方法,但至少在我们的应用程序/服务器环境中,我们无法nohup mysql...成功使用.

mysql当您最初在前台运行命令时,上面的序列还应该让您更好地控制执行命令; 例如mysql,在前台运行将允许您在MySQL提示符下安全地输入您的MySQL连接密码,而无需在命令行上提供密码作为纯文本(这可能是某些托管/服务器环境中的重要安全考虑因素,尤其是共享主机,其中在命令行上输入的密码可能最终会出现在日志文件中,例如〜/ .bash_history或类似内容.此外,在前台运行命令将允许您在MySQL命令移动到后台之前查看并响应任何连接或其他错误.

还必须在本页面上获得@ dan08的答案,并向@Node提供有关将已经运行的前台进程放入后台的答案,以帮助激发此处提出的解决方案.

希望这个提议的解决方案能够帮助那些发现自己处于类似情况的人,他们的运行nohup mysql...不能按预期运行.


Sta*_*nko 8

我更喜欢这种方式:

mysql -u <user> -p<pass> -e 'Insert Query Here' &>> query.log & disown
Run Code Online (Sandbox Code Playgroud)

例子:

mysql -u root -pmypassword -e 'UPDATE bigtable SET column = "value";' &>> query.log & disown
Run Code Online (Sandbox Code Playgroud)
  • 之后没有空格-p
  • &>> query.log将 stdout 和 stderr 重定向到query.log(使用您的路径),否则整个输出将被转换为终端
  • &在后台运行命令
  • disown从当前终端分离命令,如果关闭终端,则命令在超时后不会消失

您可以使用控制命令

SHOW FULL PROCESSLIST;
Run Code Online (Sandbox Code Playgroud)

您也可以使用停止它

KILL [id]; -- get the ID from previous command
Run Code Online (Sandbox Code Playgroud)