2015-09-15 27 views
1

我需要運行一個MySQL腳本,根據我的基準測試,它應該需要14個小時才能運行。該腳本更新每一行的332715行的表:MySQL - 如何通過SSH連接運行長時間(> 14小時)的作業?

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

其餘部分的影響你有沒有到遠程機器的ssh訪問運行?如果是這樣,你可以在那裏複製腳本並在mysql服務器本地運行它。 – cb0

+0

@gwg該查詢每行都運行一次 - 這就是爲什麼它需要這麼長時間!難道你不能通過更新通過加入數據而不是通過子查詢選擇所需的值來改變它對集合進行操作嗎?這樣你就可以得到一次執行 - 並且可以提高性能。 –

回答

2

擴大對我的評論,你要表現不佳的350K記錄更新語句。這是因爲您基於子查詢的結果進行設置,而不是作爲一組進行更新。因此,您爲每一行運行一次語句。更新如此:

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

這並不回答您的問題本身,但我會有興趣知道它運行多快。

+1

哇。這可能會持續2-5秒。我不確定這裏的禮節是什麼,因爲你沒有真正回答這個問題 - 這使得尋找這個問題變得毫無用處 - 但這就是我所接受的答案。 – gwg

+0

@gwg你在尋找問題時提出了一個非常有效的觀點。無論如何,我很高興它幫助你。我說這將是可笑的,我不會猜到這樣的程度! :-) 感謝您的反饋。 –

1

最快的方法可能是在screentmux會話中運行它。

+0

我認爲如果網絡出現故障,即使屏幕/ tmux無法保持會話打開狀態。它可以保持一個進程運行,即使我從tty分離後,但是不會有一個ssh連接仍然會出現「壞管道」? – cb0

+0

你是否在mysql所在的服務器上運行mysql語句?或者你有一個ssh隧道部署並從本地機器運行mysql?如果是前者,則在服務器上啓動tmux,而不是在本地計算機上運行,​​並在其中運行mysql。 – Evert

0

如果你有服務器的SSH訪問權限,你可以將其複製並運行它有下列行:

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

我確實可以訪問。所以這不會下降,即使SSH連接下降?這是因爲它沒有建立一個ssh連接來實際傳輸文件? – gwg

+0

它正在進行2 ssh連接。第一次它只會傳輸包含你的mysql查詢的腳本。第二次ssh連接到遠程機器控制檯,並在那裏執行腳本。 &符將確保腳本在遠程機器的背景中運行,因此可以安全地卸下第二個ssh連接。如果遠程計算機沒有重新啓動,並且您的進程不會被其他人殺死,那麼您是安全的,只要需要它就會運行。 – cb0

0

也許你可以嘗試用頻繁的提交而不是一次巨大的更新來做300k更新。做這些事情,任何失敗的事情都會導致你已經應用的變化。

一些dimacic SQL你可以得到所有的線條一氣呵成,隨後將文件複製到您的服務器......

0

下面是我在過去,我跑在遠程服務器整體ALTER查詢做到了這拿某個年齡:

mysql -h [host] -u [user] -p [database] <my_script.sql> result.log 2>&1 & 

這樣你就不需要等待它,因爲它會在它自己的時間完成,你可以自定義,並在開始和結束在my_script.sql現在()加選擇,找出如果你感興趣,需要多長時間。

事情也考慮是否適用

  1. 爲什麼這個查詢藉此長,我們可以提高它(例如:禁用鍵檢查..,離線準備數據和更新用臨時表..
  2. 我們能否打破查詢批量
  3. 什麼是對的DB 等