我有一个用于访客计数的 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
按运行时对查询进行排序。
一旦隔离了导致锁定的查询,您就可以尝试确定锁定的原因。表上是否有更改导致写入锁定?有各种不同的情况,在大多数情况下都与应用程序问题有关。
如果不主动排除故障,很难提供任何明确的建议。至少,进程列表和相关应用程序等更多详细信息会有所帮助。