Назад | Перейти на главную страницу

Блокировки таблиц 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)

Извините за мой плохой английский и спасибо за вашу помощь ;-)

Уловка обычно заключается в том, чтобы найти самый длинный выполняющийся запрос, который указан в show full processlist; Вы также можете использовать такую ​​утилиту, как mytop для сортировки запросов по времени выполнения.

После того как вы изолировали запрос, вызывающий блокировку, вы можете попытаться определить, почему он заблокирован. Произошло ли изменение таблицы, вызвавшее блокировку записи? Существует множество различных сценариев, которые в большинстве случаев связаны с проблемой приложения.

Без активного устранения неполадок очень сложно дать какие-либо окончательные рекомендации. По крайней мере, были бы полезны дополнительные детали, такие как список процессов и рассматриваемое приложение.