Linux

什麼條件觸發表級鎖

  • March 1, 2013

在處理一些 vBulletin 性能問題時,我遇到了這種情況,所有東西都卡在等待表級鎖上:

Id  Command Time State                       Info
83  Query   47  Writing to net               SELECT /*!40001 SQL_NO_CACHE */ * FROM `post`
87  Query   117 Waiting for table level lock UPDATE session     SET lastactivity = 1362132185, location = '/for
89  Query   116 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1
90  Query   113 Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '66.24
94  Query   108 Waiting for table level lock select userid from session where sessionhash = '2269de072969ab9d42
96  Query   102 Waiting for table level lock SELECT *    FROM session    WHERE sessionhash = 'b0e3d290e9f609160
129  Query   15  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '65.55
130  Query   14  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '71.19
132  Query   13  Waiting for table level lock SELECT *    FROM session    WHERE userid = 0     AND host = '178.1

通常診斷鎖定問題的模式是找出鎖定的查詢,並且通常是你的罪魁禍首。但在這種情況下,它正在讀取一個不相關的表,並且執行時間最長的查詢(這肯定是問題的一部分,因為它是唯一的更新查詢)也被鎖定。

所以問題是,有哪些額外的條件會導致應用表級鎖,這是您可能從這裡看到的情況所期望的。


添加詳細資訊

這是關於標準 mysql 安裝的;不涉及分區或其他惡作劇

posts是 MyISAM 類型

session是 MEMORY 類型

其他問題(例如查詢 83 明顯的低效率或使用 MyISAM 的不明智)很有趣,但不是所問的問題。

查詢 87 的全文如下所示:

Query UPDATE session SET lastactivity = 1362132185, location = '/forums/forumdisplay.php?f=421', inforum = 421, inthread = 0, incalendar = 0, badlocation = 0 WHERE sessionhash = 'e6322935fe2df18106878473f310d91f'

mysqldump 是否在鎖定時執行?看起來執行緒 83 可能目前正在導出post,但可能已呼叫LOCK TABLES數據庫以在所有表​​上獲得一致的位置。

引用自:https://serverfault.com/questions/483854