我需要运行一个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
);
(该脚本很不幸;我需要将所有数据从gene_set
传输到attribute
,但首先我必须正确设置外键以指向attribute
)。
我无法使用此命令成功运行它:
nohup mysql -h [host] -u [user] -p [database] < my_script.sql
例如,昨晚,它运行了10个多小时,但ssh连接断了:
Write failed: Broken pipe
有没有办法以更好地确保它完成的方式运行此脚本?我真的不在乎需要多长时间(1天vs 2天并不重要)只要我知道它会完成。
答案 0 :(得分:2)
最快捷的方法可能是在screen
或tmux
会话中运行。
答案 1 :(得分:1)
扩展我的评论,你的350k记录更新声明表现不佳。这是因为您基于子查询的结果进行设置,而不是作为一组进行更新。因此,您为每一行运行一次语句。更新如下:
UPDATE gene_set g JOIN attribute_fk a ON < all where clauses > SET g.attribute_fk = a.id.
这本身并没有回答你的问题,但我很想知道它的运行速度有多快。
答案 2 :(得分:0)
如果你有对服务器的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 &"
答案 3 :(得分:0)
也许您可以尝试使用频繁提交进行300k更新,而不是一次大量更新。做任何失败的事情都将保持已经应用的更改。
使用一些dimacic sql你可以一次性获取所有行,然后将文件复制到你的服务器......
答案 4 :(得分:0)
以下是我过去在远程服务器中运行整体更改查询的过程,这种查询需要花费很长时间:
mysql -h [host] -u [user] -p [database] < my_script.sql > result.log 2>&1 &
这样您就不需要等待,因为它会在自己的时间内完成,您可以自定义并在my_script.sql
的开头和结尾添加select now(),以了解它花了多长时间如果你感兴趣的话。
如果适用,还需要考虑的事项