【问题标题】:Running a SQL query in the background using MySQL使用 MySQL 在后台运行 SQL 查询
【发布时间】:2015-07-25 06:55:43
【问题描述】:

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

我从一位同事那里听说有,她希望我这样做。我相信她说那叫“屏风”?

【问题讨论】:

  • 是的 Linux 中有 screen 命令,只需在终端中输入 screen 然后它将打开一个新终端(新屏幕)然后在那里运行您的 SQL 命令并按 Ctrl +d 然后与 ssh 断开连接仍将在后台运行,您可以通过登录 ssh 并输入 screen -r 再次检查
  • 什么样的查询?根据服务器版本和配置,还有 EVENT。
  • 我试图用 ctrl+D 关闭它,但它似乎不起作用。
  • 我认为 Uueerdo 对 Events 的看法是正确的,但如果您的同事问您并且知道这件事,也许可以向她询问更多信息。在工作场所进行这种交流是很好的,而且你也不会冒险建立与她希望你不同的东西。不知道或不理解某事并不可耻,但隐藏这一事实可能会导致错误的期望以及大量的压力和沮丧。

标签: mysql sql


【解决方案1】:

我假设您正在 ssh-ing 到服务器,并且您希望能够关闭本地工作站。

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

所以是这样的:

nohup mysql <options> -u <user> -p <pass> -e 'Insert Query Here' &
  • nohup 用于“不挂断”,即当我 断开连接。

  • mysql ...你平时运行的mysql命令 要连接,只需添加 -e 选项即可运行查询而不打开 mysql会话

  • &amp;在后台启动进程

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

【讨论】:

  • 最好的办法是:nohup mysql -u -p -e 'your sql statement here' > /dev/null 2>&1
  • @ShahadatHossainKhan,为什么这样更好?如果没有重定向,任何消息或错误都会转到 nohup.out,因此您可以查看查询是否有效。
  • 在静音运行方面,但如果你想调试它不是一个好方法我同意
【解决方案2】:

如果您发现在使用 nohupmysql 时遇到问题 – 我在此页面上找到了受 @dan08 的 answer 以及 @Node 的 answer 启发的替代解决方案,关于将已经运行的进程放入关于 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 命令提示符处为指定的&lt;user&gt; 输入相关密码(这是通过在上面的mysql 命令中包含-p 标志来触发的)。
  3. 立即按Ctrl+Z暂停当前进程,在本例中为mysql
  4. 运行bg 命令将当前挂起的进程移至后台,并恢复其处理。
  5. 运行jobs 命令列出当前在shell 会话中运行的作业(如果当前会话中没有运行任何其他后台进程,您可能只列出一个作业)。从此列表中记下 mysql 的作业编号,如果您只运行一项作业,则可能是 1
  6. 最后但同样重要的是,运行disown -h %&lt;job number&gt; 命令,即disown -h %1(假设在上面的步骤#5 中获得的作业编号是1)。最后一条命令非常重要,因为它将当前 shell 会话与我们刚刚移入后台的 mysql 进程解除关联,因此当终端 shell 会话结束时,mysql 进程不会被杀死。如果不调用 disown,如果您的终端会话结束,您现在在后台运行的 mysql 进程仍可能被终止。

上述命令序列有效地模拟了对nohup mysql... 的调用,允许您将长时间运行的对mysql 的调用移至后台,并且在您关闭终端会话或与远程服务器。如果您发现在您的情况下运行nohup mysql... 非常有用,因为它肯定是更简单快捷的方法,但至少在我们的应用程序/服务器环境中,我们无法成功使用nohup mysql...

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

还必须感谢@dan08 在此页面上的answer,以及@Node 的answer 关于将已经运行的前台进程置于后台,以帮助激发此处提出的解决方案。

希望这个提议的解决方案能够帮助其他发现自己处于类似情况的人,其中运行 nohup mysql... 无法按预期工作。

【讨论】:

  • 非常好的细节突破!清晰、透彻、信息丰富!
【解决方案3】:

我更喜欢这种方式:

mysql -u <user> -p<pass> -e 'Insert Query Here' &>> query.log & disown

例子:

mysql -u root -pmypassword -e 'UPDATE bigtable SET column = "value";' &>> query.log & disown
  • -p 后面没有空格
  • &amp;&gt;&gt; query.log 将 stdout 和 stderr 都重定向到 query.log(使用您的路径),否则整个输出将被翻译到终端
  • &amp; 在后台运行命令
  • disown 将命令与当前终端分离,如果关闭终端,则命令在超时后不会死

你可以控制命令使用

SHOW FULL PROCESSLIST;

你也可以使用停止它

KILL [id]; -- get the ID from previous command

【讨论】:

    【解决方案4】:
    nohup mysql -h [host_ip_addr] -u [username] -p[password] [database_name] -e "sql_query" &
    

    注意:-p后不要留空格

    【讨论】:

      【解决方案5】:

      这是一个好方法...

      1. 创建在尝试登录mysql客户端时不会提示密码的环境。确保您可以在终端输入“mysql”而无需用户名和密码即可登录数据库。

      2. 然后使用这个命令-

        nohup sh -c "mysql -e 'ALTER TABLE YourDatabaseName.TableName ADD anyColumnYouWantToAdd VARCHAR(50) NULL AFTER anyOldColumn'" > /dev/null 2>&1 &

      注意:您必须提供数据库名称,否则您还必须输入“使用数据库”命令。如果您使用带引号的列、表或数据库名称,可能会出现另一个问题。

      如果您想查看日志,只需使用日志文件而不是“/dev/null”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多