在处理一些 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'
答案1
锁定时 mysqldump 是否正在运行?看起来线程 83 可能当前正在导出,post
但可能已调用LOCK TABLES
DB 来获取所有表上的一致位置。