MySQL-如何通过SSH连接运行长时间(>14小时)作业?

MySQL-如何通过SSH连接运行长时间(>14小时)作业?,mysql,Mysql,我需要运行一个MySQL脚本,根据我的基准测试,该脚本需要14个多小时才能运行。脚本正在更新332715行表中的每一行: UPDATE gene_set SET attribute_fk = ( SELECT id FROM attribute WHERE gene_set.name_from_dataset <=> attribute.name_from_dataset AND gene_set.id_from_dataset <=&g

我需要运行一个MySQL脚本,根据我的基准测试,该脚本需要14个多小时才能运行。脚本正在更新332715行表中的每一行:

UPDATE gene_set SET attribute_fk = (
    SELECT id FROM attribute WHERE
        gene_set.name_from_dataset <=> attribute.name_from_dataset AND
        gene_set.id_from_dataset <=> attribute.id_from_dataset AND
        gene_set.description_from_dataset <=> attribute.description_from_dataset AND
        gene_set.url_from_dataset <=> attribute.url_from_dataset AND
        gene_set.name_from_naming_authority <=> attribute.name_from_naming_authority AND
        gene_set.id_from_naming_authority <=> attribute.id_from_naming_authority AND
        gene_set.description_from_naming_authority <=> attribute.description_from_naming_authority AND
        gene_set.url_from_naming_authority <=> attribute.url_from_naming_authority AND
        gene_set.attribute_type_fk <=> attribute.attribute_type_fk AND
        gene_set.naming_authority_fk <=> attribute.naming_authority_fk
    );
例如,昨晚,它运行了10个多小时,但ssh连接中断:

Write failed: Broken pipe

是否有任何方法可以运行此脚本以更好地确保它完成?我真的不在乎1天和2天的时间长短,只要我知道它会完成,这并不重要。

最快的方法可能是在屏幕或tmux会话中运行它。

如果您有ssh访问服务器的权限,您可以复制它并在那里运行,并使用以下行:

#copy over to tmp dir
scp my_script.sql user@remoteHost:/tmp/
#execute script on remote host
ssh -t user@remoteHost "nohup mysql \
    -h localhost -u [user] -p [database] < /tmp/my_script.sql &"

继续我的评论,350k记录更新语句的性能很差。这是因为您正在根据子查询的结果进行设置,而不是作为一个集合进行更新。因此,每行运行一次语句。更新如下:

UPDATE gene_set g JOIN attribute_fk a ON < all where clauses > SET g.attribute_fk = a.id.

这本身并不能回答您的问题,但我很想知道它的运行速度有多快。

也许您可以尝试频繁提交300k更新,而不是一次大型更新。如果在任何时候失败,那么这样做将保持已经应用的更改


使用一些dimacic sql,您可以一次获得所有行,稍后将文件复制到您的服务器

我以前是这样做的,在远程服务器上运行单块alter查询,这需要花费一些时间:

mysql -h [host] -u [user] -p [database] < my_script.sql > result.log  2>&1 &
这样,您就不需要等待它,因为它将在自己的时间内完成,您可以自定义并在my_script.sql的开始和结束处添加select now,以了解您感兴趣时所花的时间

也可考虑是否适用

为什么这个查询需要这么长时间,我们可以改进它吗,脱机准备数据并使用临时表进行更新。。 我们可以中断查询以成批运行吗 对DB的其他部分有什么影响 等
您是否具有远程计算机的ssh访问权限?如果是这样的话,您可以将脚本复制到那里,并在mysql服务器内部本地运行它。@gwg该查询每行运行一次-这就是为什么要花这么长时间!您不能通过更新通过连接数据而不是通过子查询选择得到的所需值,将其更改为对集合进行操作吗?这样,您将得到一次执行,并获得可笑的性能改进。我认为,如果网络崩溃,即使screen/tmux无法保持会话打开。即使在我从tty分离之后,它也可以保持进程运行,但是ssh连接不会仍然得到断开的管道吗?您是否在mysql所在的同一台服务器上运行mysql语句?或者您是否部署了ssh隧道并从本地计算机运行mysql?如果是前者,你在服务器上启动tmux,而不是在本地机器上,然后在服务器内运行mysql,我有访问权限。所以即使ssh连接断开,这也不会断开?这是因为它没有建立ssh连接来实际传输文件吗?它正在建立2个ssh连接。第一次,它将只传输包含mysql查询的脚本。第二次,它将ssh连接到远程机器控制台,并在那里执行脚本。符号将确保脚本在远程机器的后端运行,以便可以安全地断开第二个ssh连接。如果远程计算机没有重新启动,并且您的进程不会被其他人终止,那么您是安全的,它将在需要的时间内运行。哇。这大概需要2-5秒。我不确定这里的礼仪是什么,因为你没有真正回答这个问题,这使得搜索这个问题毫无用处,但这是我的答案。@gwg你在搜索这个问题上的观点非常正确。尽管如此,我很高兴它帮助了你。我说这很可笑,但我不会猜到这么大的程度谢谢你的反馈。
mysql -h [host] -u [user] -p [database] < my_script.sql > result.log  2>&1 &