2010-06-09 183 views
5

我有一個〜800k行的表。我跑了一個update users set hash = SHA1(CONCAT({about eight fields})) where 1;殺死mysqld進程

現在我有一個掛Sequel臨進程,我不知道mysqld進程。

這是兩個問題:

  1. 哪些危害都不可能來自殺死這些程序?我正在研究一個單獨的數據庫,因此不會對系統上的其他數據庫造成損害,對吧?

  2. 假設你必須更新這樣的表。如果不編寫單獨的腳本,更新會更快更可靠。

我只是檢查與phpMyAdmin和彷彿查詢完成它出現。我仍然有續集專業使用我的兩個內核,雖然100%......

回答

5

如果您使用InnoDB(由事務日誌支持以進行恢復和回滾),那麼您可以逃脫很多,特別是在非生產環境中。

終止叛徒查詢的最簡單方法是使用MySQL的shell作爲根用戶:

SHOW PROCESSLIST; 

這會給你當前連接的列表,併爲每一個進程ID。要終止任何給定的查詢(如第19號),請使用:

KILL 19; 

通常這會撤銷並回滾查詢。在某些情況下,這是不夠的,你可能不得不用kill -9強制退出MySQL服務器進程。在大多數情況下,您應該能夠立即重新啓動服務器,並且數據庫將處於上次完全提交狀態。

1

要獲得線程ID(它會一起顯示查詢):

mysqladmin proc 

爲了安全地殺死查詢線程:

mysqladmin kill [id] 

除非您使用innodb,否則您最終將得到部分更新的表格,但您應該沒問題。 Details

在UPDATE或DELETE操作,每個 塊讀取之後 殺標誌的檢驗和每個更新後或 刪除的行。如果kill標誌被設置,則 該語句被中止。請注意,如果您沒有使用事務 ,則 更改不會回滾。

至於你的第二個問題,沒有更好的方法來更新表,如果不允許寫一個單獨的腳本(以扼殺更新)。