6

Я пытаюсь отладить ошибку «Задержка ожидания ожидания ожидания превышена» в MySQL (AWS RDS) v5.6.19a, которая периодически возникает при попытке выбрать строку, используя первичный идентификатор, для обновления, то есть:Долгосрочная транзакция «очистка» mysql

SELECT primary_id FROM tbl_widgets WHERE primary_id = 5 FOR UPDATE 

После многих часов отладки я исключил другую часть моего приложения «непосредственно» запирающего ту же строку (что было очевидный виновник). Таким образом, я начал копать глубже в отверстие кролика, который MySQL замок и заметил следующее соотношение между «Тайм-аут блокировки ожидания превышено» ошибка броска и информация, предоставленная:

SHOW ENGINE INNODB STATUS; 

Там, как представляется, длинный работает TRANSACTION в очисток состояния, которое запирающее медленно увеличивающееся число строк для UPTO ~ 10 минут, вот соответствующие строки для этой сделки от 10 ручных INNODB СТАТУСА запросов:

2015-08-19 13:29:04 
---TRANSACTION 25861246681, ACTIVE 158 sec 
10 lock struct(s), heap size 1184, 21 row lock(s), undo log entries 20 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7146839061 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:29:42 
---TRANSACTION 25861246681, ACTIVE 196 sec 
13 lock struct(s), heap size 2936, 28 row lock(s), undo log entries 27 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147149416 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:30:10 
---TRANSACTION 25861246681, ACTIVE 224 sec 
13 lock struct(s), heap size 2936, 31 row lock(s), undo log entries 30 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id23 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:30:41 
---TRANSACTION 25861246681, ACTIVE 255 sec 
13 lock struct(s), heap size 2936, 35 row lock(s), undo log entries 34 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147511090 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:31:12 
---TRANSACTION 25861246681, ACTIVE 286 sec 
15 lock struct(s), heap size 2936, 38 row lock(s), undo log entries 37 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147604774 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:31:30 
---TRANSACTION 25861246681, ACTIVE 304 sec 
21 lock struct(s), heap size 2936, 42 row lock(s), undo log entries 39 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147789789 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:31:57 
---TRANSACTION 25861246681, ACTIVE 331 sec 
21 lock struct(s), heap size 2936, 46 row lock(s), undo log entries 43 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147837536 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:32:28 
---TRANSACTION 25861246681, ACTIVE 362 sec 
22 lock struct(s), heap size 2936, 51 row lock(s), undo log entries 48 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7147905807 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:33:16 
---TRANSACTION 25861246681, ACTIVE 410 sec 
23 lock struct(s), heap size 2936, 58 row lock(s), undo log entries 55 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7148317478 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

2015-08-19 13:33:49 
---TRANSACTION 25861246681, ACTIVE 443 sec 
24 lock struct(s), heap size 2936, 64 row lock(s), undo log entries 61 
MySQL thread id 5110120, OS thread handle 0x2ba082506700, query id 7148471519 10.0.1.154 mfuser cleaning up 
Trx read view will not see trx with id >= 25861246682, sees < 25861246682 

я наткнулся следующая запись в блоге (http://databaseblog.myname.nl/2014/10/when-your-query-is-blocked-but-there-is_26.html) th при обеспечивает потенциальное решение, которое помогает определить, что происходит в этих длительных сделках, в частности, установить:

set GLOBAL innodb_status_output_locks=ON; 

К сожалению, это не возможно выполнить эту операцию на RDS из-за ограниченное разрешение.

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

Изменить, чтобы добавить: Среднее использование ЦП экземпляра MySQL составляет 20%

ответ

1

В моем случае мой «очистки» замки ушли после того, как я убил JVM я бегала мой отладчик Видимо, они были пережитком. более раннего прогона отладки, который я прервал до того, как транзакция была очищена.

Возможно, это вам не поможет, но вот пара предложений для отладки в этой ситуации.

  1. У вас есть одна информация, которая представляет собой количество замков. Используя точки останова, вы можете приостановить приложение в разных местах, чтобы попытаться точно определить, когда счетчик увеличивается. (Или, может быть, он поднимается только после того, как определенные ошибки будут видны в журнале или только после определенных действий пользователя.)

  2. Если вы не можете использовать контрольные точки, у вас есть еще один инструмент, который является заявлением select for update, которое после блокировки. Возможно, вы сможете посыпать его вокруг своего кода, возможно, с помощью дополнительного ведения журнала, чтобы определить, где начинается блокировка.

  3. Рассмотрите возможность временной отладки приложения в локально установленной базе данных MySQL. Это может быть установлено либо на локальном сервере, либо на вашей машине разработки. Это может быть хлопоты, чтобы установить, но может иметь много других преимуществ (например, тест-кровать для БД скриптов;. Умение работать на ноутбуке в автономном режиме)

Все это предполагает, что блокировка была вызвана вашим собственный код, а не какую-то другую работу. (В вашем журнале очищающий пользователь «mfuser».) Это позволяет воспроизводить проблему по требованию.

+0

Я вспомнил еще один отладочный трюк; вставлен как второй элемент. Я также добавил заключительный абзац, в котором излагалось предположение, которое я сделал. – Bampfer

Смежные вопросы