InnoDB 表无明显原因锁定

InnoDB 表无明显原因锁定

我有一个用于访客计数的 InnoDB 表,它已经完美地运行了好几年,但是昨天它失败了两次,可能是由于访客数量增加而导致的。没有明显的原因,这个表被锁定了,有数百个DELETE查询REPLACE INTO(+500)处于“正在更新”或“正在清理”状态。(我不再有进程列表的副本......)

该表包含的条目很少,在 500 到 1500 之间,因此更新查询通常非常快并且不会锁定。

问题发生时,我多次检查了进程列表,没有看到任何明确锁定表的查询。实际上,我将网站设置为维护模式,因此没有更多查询添加到队列中,但仍然有超过 500 个查询,全部相同:

+---------+---------+--------------+---------+---------+------+----------+-----------------------------------------------+
| Id      | User    | Host         | db      | Command | Time | State    | Info                                          |
+---------+---------+--------------+---------+---------+------+----------+-----------------------------------------------+
| 2780657 | XXXXXXX | XXXXXX:58199 | XXXXXXX | Query   |  660 | updating | DELETE FROM connected WHERE time < 1272100968 |
| 2764941 | XXXXXXX | XXXXXX:57314 | XXXXXXX | Query   |  660 | updating | DELETE FROM connected WHERE time < 1272100968 |
| 2784467 | XXXXXXX | XXXXXX:44221 | XXXXXXX | Query   |  661 | updating | DELETE FROM connected WHERE time < 1272100969 |
...

我不知道必须去哪里寻找这个问题的原因并彻底解决它。

但我想这可以让你更好地了解这个问题:

mysql> show global status like "%innodb_row_lock%";
+-------------------------------+-----------+
| Variable_name                 | Value     |
+-------------------------------+-----------+
| Innodb_row_lock_current_waits | 0         |
| Innodb_row_lock_time          | 132004175 |
| Innodb_row_lock_time_avg      | 10521     |
| Innodb_row_lock_time_max      | 59373     |
| Innodb_row_lock_waits         | 12546     |
+-------------------------------+-----------+
5 rows in set (0.00 sec)

抱歉我的英语不好,谢谢你的帮助;-)

答案1

诀窍通常是找到运行时间最长的查询,该查询在show full processlist; 您还可以使用类似的实用程序mytop按运行时对查询进行排序。

一旦隔离了导致锁定的查询,您就可以尝试确定锁定的原因。表上是否有更改导致写入锁定?有各种不同的情况,在大多数情况下都与应用程序问题有关。

如果不主动排除故障,很难提供任何明确的建议。至少,进程列表和相关应用程序等更多详细信息会有所帮助。

相关内容