2011-02-18 20 views
7

我有一個將數據從一個表複製到另一個表進行處理的MySQL查詢。由於某種原因,這個查詢通常需要幾秒鐘的時間鎖定在一夜之間,並運行了幾個小時。當我今天早上登錄時,我試圖殺死查詢,但它仍列在進程列表中。MySQL查詢在被殺後不會消失

| Id  | User  | Host  | db | Command | Time | State  | Info                     | 
+---------+----------+-----------+------+---------+-------+--------------+--------------------------------------------------------------------------------------+ 
| 1061763 | tb_admin | localhost | dw | Killed | 45299 | Sending data | INSERT INTO email_data_inno_stage SELECT * FROM email_data_test LIMIT 4480000, 10000 | 
| 1062614 | tb_admin | localhost | dw | Killed | 863 | Sending data | INSERT INTO email_data_inno_stage SELECT * FROM email_data_test LIMIT 4480000, 10000 | 

什麼可能導致這種情況,我該如何殺死這個過程,以便我可以繼續工作?

+0

彈跳mysql會清除,如果你想去核選項。 – 2011-02-18 15:44:04

回答

3

如果表email_data_test是MyISAM並且它已被鎖定,那麼將阻止INSERT。

如果表email_data_test是InnoDB,那麼很多MVCC數據正在寫入ib_logfiles中,這可能還沒有發生。

在這兩種情況下,您都有LIMIT子句滾動瀏覽4,480,000行,以獲得實際需要INSERT的10,000行。

殺死查詢只會導致InnoDB表email_data_inno_stage執行回滾。

+0

謝謝。桌子是innodb。我知道這可能不是一個理想的方式,但是如果我處理了7000萬條記錄的整個email_data_test表,那麼如果數據庫甚至可以處理它,那麼我們將永遠佔用它,所以我把它作爲10k條記錄批量處理。 – Wige 2011-02-18 15:56:00