使用MySQL在后台运行SQL查询

时间:2015-05-13 19:58:05

标签: mysql sql

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

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

5 个答案:

答案 0 :(得分:10)

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

您可以使用+-------------+-----------------+-----------------+ | COLUMN_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE | +-------------+-----------------+-----------------+ | PersonID | PK_Person | PRIMARY KEY | | DateOfBirth | CK_Person | CHECK | | DateOfDeath | CK_Person | CHECK | +-------------+-----------------+-----------------+ 和后台进程。了解mysql命令的nohup选项也很有用。

这样的事情:

-e
  • nohup mysql <options> -u <user> -p <pass> -e 'Insert Query Here' & 用于“不挂机”#39;也就是说,当我没有结束这个过程 断开。

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

  • mysql ...在后​​台启动该过程

我不确定这个但是: 如果您不想在命令中输入密码,请运行不带密码的命令,键入&密码提示应该返回,输入密码,fg将发送回程到后台,然后你可以断开连接。

答案 1 :(得分:7)

如果您发现nohup使用mysql时遇到问题 - 我在此页面上找到了受@ dan08&#39; answer启发的替代解决方案,以及@Node& #39; s answer关于将已经运行的进程从SO上的另一个问题放入后台。

我在尝试使用nohup mysql...来建议背景&#39;一个长时间运行的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标志触发的。) / LI>
  3. 立即按 Ctrl + Z 暂停当前进程,在本例中为mysql
  4. 运行bg命令将当前暂停的进程移至后台,然后继续处理。
  5. 运行jobs命令列出当前在shell会话中运行的作业(如果您没有在当前会话中运行任何其他后台进程,则可能只列出一个作业)。从此列表中注明mysql的作业编号,如果您只有一个作业正在运行,则可能为1
  6. 最后但并非最不重要的是,运行disown -h %<job number>命令,因此disown -h %1(假设上面步骤#5中获得的作业号是1)。最后一个命令非常重要,因为它将当前shell会话与我们刚刚移入后台的mysql进程解除关联,以便在终端shell会话结束时mysql进程不会被终止。如果没有调用disown,那么现在在后台运行的mysql进程可能会在您的终端会话结束时被终止。
  7. 上述命令序列有效地模仿了对nohup mysql...的调用,允许您将长时间运行的呼叫移至mysql进入后台,如果关闭终端会话,则不会终止进程或从远程服务器断开连接。如果您发现在您的环境中运行nohup mysql...非常有用,因为它肯定是更简单,更快捷的方法,但至少在我们的应用程序/服务器环境中,我们无法成功使用nohup mysql...。 / p>

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

    还必须在此页面上显示@ dan08&#39; answer,并将@ answer关于将已经运行的前台流程放入后台,以帮助激发所提议的解决方案这里。

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

答案 2 :(得分:1)

nohup mysql -h [host_ip_addr] -u [username] -p[password] [database_name] -e "sql_query" &

注意:在-p

之后不要给出空格

答案 3 :(得分:0)

我更喜欢这样:

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后没有空格
  • &>> query.log将stdout和stderr都重定向到query.log中(使用您的路径),否则整个输出将转换为终端机
  • &在后​​台运行命令
  • disown从当前终端分离命令,如果关闭终端,则命令在超时后不会消失

您可以使用来控制命令

SHOW FULL PROCESSLIST;

您也可以使用

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

答案 4 :(得分:0)

这是个好方法...

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

  2. 然后使用此命令-

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

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

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