2010-02-12 74 views
2

我有一個大量的非常類似InnoDB數據庫的數據庫服務器。我運行的查詢通常只是在一個小表中的一行上更新時間戳。這大概需要1-2毫秒。偶爾在晚上,可能在備份和maatkit複製工具正在運行時,這些查詢中的一個或多個可能會在幾分鐘內顯示「正在更新」。在此期間,其他查詢(包括maatkit查詢)似乎正在正常進行,並且沒有其他查詢似乎正在執行。我一直無法解釋或解決這個問題。爲什麼簡單的MySQL更新查詢偶爾需要幾分鐘?

我們使用mysql 4.1.22和gentoo 2.6.21在一對4路至強處理器上安裝16g內存和RAID驅動器進行存儲。使用maatkit每晚確認複製,複製到位並運行良好。 InnoDB正在使用大部分RAM,並且CPU通常閒置70-80%。所討論的表格大約有100行,每行大約200字節。我已經試過,沒有WHERE子句的索引,沒有明顯的變化。沒有發現異常的日誌消息(檢查系統消息和mysql錯誤)。

有沒有人聽說過這個?解決這樣的事情?任何想法如何調查?

回答

0

使用響應中提供的一些信息,我們繼續調查並發現服務器上存在一些令人不安的行爲。任何數據庫中任何表上的簡單「檢查表」都會導致簡單的更新查詢鎖定其他數據庫和其他表。我不知道爲什麼會發生這種情況,儘管我們無法在MySQL v5.1上重現它,所以我們打算升級我們的數據庫服務器。

我不認爲maatkit的mk-table-checksum會執行「檢查表」,但它具有類似的效果。關閉這個腳本可以顯着減少這些問題,但我們相信,如果沒有這個腳本,我們就不能生活。

我打算把這個標記爲我的問題的答案。謝謝您的幫助。

1

當進行DML操作時,InnoDB對行和索引間隙進行了鎖定。

的問題是,它鎖定檢查,所有行不僅是影響

說,如果你運行此查詢:

UPDATE mytable 
SET  value = 10 
WHERE col1 = 1 
     AND col2 = 2 

,鎖定將取決於用於查詢索引:

  • 如果使用上col1, col2索引,那麼不僅影響行將被鎖定

  • 如果使用col上的索引,則所有包含col1 = 1的行都將被鎖定

  • 如果使用上col2索引,與col2 = 2所有行將被鎖定

  • 如果沒有使用索引,所有的行和索引間隙將被鎖定(包括在PRIMARY KEY,所以,即使INSERTAUTO_INCREMENT列將鎖定)

更糟糕的是,在EXPLAINMySQL不上DML操作的工作,所以你必須猜測使用哪個索引,因爲優化器可以選擇一個如果它認爲它是最好的。

因此,您的複製工具和更新可能會同時鎖定記錄(並且您可以看到即使WHERE條件不重疊也可能會發生這種情況)。

+0

那麼過程列表不會顯示「鎖定」嗎?我有一個「顯示完整進程列表」,顯示maatkit在一個數據庫上工作,其中一個平凡的更新查詢在第二個數據庫上「更新」,另一個在第三個數據庫上進行同樣的更新查詢「更新」,以及沒有其他查詢正在運行。我沒有發佈過程列表,因爲它包含了我不得不編輯的客戶端名稱。 – PaulC 2010-02-12 16:08:05

+0

@PaulC:'SHOW PROCESSLIST'不會爲'InnoDB'表顯示'Locked',僅對'MyISAM'顯示。即使針對'InnoDB'表的操作正在等待一個鎖,它仍然會顯示爲'Updating'。 – Quassnoi 2010-02-12 18:14:17

+0

瞭解InnoDB在「鎖定」時會顯示「正在更新」是非常有用的。禁用maatkit的重新同步暫時解決了這個問題,所以看起來maatkit確實會鎖定某些內容。仍在調查...... – PaulC 2010-02-20 21:16:39

0

如果在查詢掛起時可以訪問服務器,請嘗試執行「顯示innodb狀態」。部分數據混亂是InnoDB表上所有活動連接/查詢的狀態。如果您的查詢由於另一個事務而掛起,它將在那裏顯示。有鎖數據的樣本here

同樣,你提到它似乎發生了持續的備份。你使用mysqldump嗎?這將在轉儲處於活動狀態時鎖定表,以便轉儲的數據保持一致。

相關問題