powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очередной вопрос про "lock wait timeout exceeded"
15 сообщений из 15, страница 1 из 1
Очередной вопрос про "lock wait timeout exceeded"
    #40100594
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После перевода базы с MyISAM на InnoDB и построения кластера galera из трех нод стал периодически (раз в несколько дней) получать проблему того, что весь кластер встает колом и на одном из серверов (первоначальном) в логах сыпет
Код: sql
1.
2.
3.
4.
2021-09-29  1:00:51 140492072966912 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transaction
2021-09-29  1:00:51 140492072966912 [Note] Event Scheduler: [root@localhost].[radius.finish_stale_sessions2] event execution failed.
2021-09-29  2:00:51 140492072659712 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transaction
2021-09-29  2:00:51 140492072659712 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transacti


При этом процесс mysql на этом сервере жрет весь процессор, даже не могу подключится ни через phpmyadmin, ни через консоль. service mariadb stop долго ждет, потом выдает "не удалось остановить". Помогает только kill -9 [pid-mysql] и рестарт сервера заново.

Как я понимаю, подвисает скрипт из шедулера finish_stale_sessions2 (выполняется раз в час), который довольно простой:
Код: sql
1.
update `radacct` set acctstoptime=CURRENT_TIME(), acctterminatecause='Update timeout' where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 1440 MINUTE)


Его смысл - поменять пару столбцов в некоторых строках. В эту же таблицу идет поток insert'ов примерно до нескольких штук в секунду (суммарно по всех трем серверам в кластере).

Я не пойму как все это отдебажить и почему оно вообще возникает. Ранее был единственный сервер и база была в MyISAM, ни разу такой проблемы не было. Никаких сложных транзакций в базе нет, размер базы ~1Гб, в проблемной таблице сейчас около 1 млн строк. Update из скрипта пытается поменять ну от силы несколько сотен строк за раз. Больше всего печалит, что колом встает весь кластер, при этом каких то ошибок в логах на других серверах нет.

Есть какие то мысли, как понять причину? Правильно ли я понимаю, что скрипт не успевает уложиться в дефолтные 50сек и делает рестарт? Поможет ли увеличение этого лимита и сколько его надо сделать?

Для теста сейчас выполнил запрос из скрипта руками (уменьшив INTERVAL, чтобы взять больше строк для изменения):
Код: sql
1.
2.
3.
MariaDB [radius]> update `radacct` set acctstoptime=CURRENT_TIME(), acctterminatecause='Update timeout' where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 360 MINUTE);
Query OK, 2090 rows affected (0.61 sec)
Rows matched: 2090  Changed: 2090  Warnings: 0


0.61 сек, откуда вдруг берется таймаут в 50 сек, я не понимаю.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100602
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай сперва SELECT .. FOR UPDATE, а потом сразу UPDATE.

Надеюсь, индекс (acctstoptime, acctupdatetime) имеется?

xeonz
как понять причину?

Ну как... у тебя идут внешние запросы, которые потенциально могут интерферировать с твоим запросом на обновление. Вот и начинается прыготня с блокировками.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100615
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторСделай сперва SELECT .. FOR UPDATE, а потом сразу UPDATE.
Akina,

Я правильно понял, что мой скрипт должен выглядеть так?
Код: sql
1.
2.
select * from `radacct` where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 1440 MINUTE) for update;
update `radacct` set acctstoptime=CURRENT_TIME(), acctterminatecause='Update timeout' where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 1440 MINUTE);


Я не силен в базах данных и не особо понимаю, каким образом этот select for update может помочь.

авторНадеюсь, индекс (acctstoptime, acctupdatetime) имеется?
Скорее всего нет. Есть смысл добавить?
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100619
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xeonz
не особо понимаю, каким образом этот select for update может помочь.

Запрос FOR UPDATE блокирует выбранные записи. И соответственно следующий запрос не наткнётся на изменения от других запросов и необходимость ждать.

xeonz
Скорее всего нет. Есть смысл добавить?

Полагаю, в его наличии есть смысл - без него Вы получаете скан таблицы, а не отбор по индексу. В любом случае, надо смотреть изменение плана выполнения и производительности запроса, но думаю, что при селективности в 10к выигрыш будет.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100672
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
[
Запрос FOR UPDATE блокирует выбранные записи. И соответственно следующий запрос не наткнётся на изменения от других запросов и необходимость ждать.

В какой момент снимается блокировка?
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100772
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xeonz
В какой момент снимается блокировка?
В момент завершения текущей транзакции.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100906
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
xeonz
В какой момент снимается блокировка?
В момент завершения текущей транзакции.

Если я скрипт (ивент) вот так оформил - корректно получилось?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN

START TRANSACTION;

select * from `radacct` where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 720 MINUTE) for update;

update `radacct` set acctstoptime=CURRENT_TIME(), acctterminatecause='Update timeout' where acctstoptime is NULL and acctupdatetime < DATE_SUB( CURRENT_TIME(), INTERVAL 720 MINUTE);

commit;

END
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40100964
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде на первый взгляд более-менее нормально... протестируй.

Правда, смущает использование CURRENT_TIME() - оно ж разное в двух последовательных запросах. Tак что я бы сперва откатился во времени в переменную
Код: sql
1.
SET @timepoint := CURRENT_TIME() - INTERVAL 720 MINUTE


а потом её использовал, чтобы гарантировать одну и ту же точку времени в обоих запросах.

И потом - эта функция же возвращает чисто время... вот точно не надо вместо него использовать дату-время?
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101091
hck2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xeonz

Скорее всего нет. Есть смысл добавить?

если индекса нет, чудо mysql зачем-то ставит блокировки абсолютно на все записи таблицы.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101202
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hck2
xeonz

Скорее всего нет. Есть смысл добавить?

если индекса нет, чудо mysql зачем-то ставит блокировки абсолютно на все записи таблицы.

Интересно. Добавил индекс по одному из столбцов (по другому уже был).
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101203
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

И потом - эта функция же возвращает чисто время... вот точно не надо вместо него использовать дату-время?

Ну в таком виде все работает как надо, выбираются именно те записи (старше, чем последние 720 минут по этому столбцу с датой-временем), которые мне надо.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101213
hck2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xeonz

Интересно. Добавил индекс по одному из столбцов (по другому уже был).

теперь и select for update не нужен. с индексами у него проснется совесть и будет лочить только то, что необходимо.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101983
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению все это не помогло, сегодня опять все встало:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
2021-10-05  6:21:40 140139215698688 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Query execution was interrupted
2021-10-05  6:21:40 140139215698688 [Note] Event Scheduler: [root@localhost].[radius.finish_stale_sessions2] event execution failed.
2021-10-05  7:22:31 140138950011648 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transaction
2021-10-05  7:22:31 140138950011648 [Note] Event Scheduler: [root@localhost].[radius.finish_stale_sessions2] event execution failed.
2021-10-05  8:22:31 140138949397248 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transaction
2021-10-05  8:22:31 140138949397248 [Note] Event Scheduler: [root@localhost].[radius.finish_stale_sessions2] event execution failed.
2021-10-05  9:22:31 140138949397248 [ERROR] Event Scheduler: [root@localhost][radius.finish_stale_sessions2] Lock wait timeout exceeded; try restarting transaction
2021-10-05  9:22:31 140138949397248 [Note] Event Scheduler: [root@localhost].[radius.finish_stale_sessions2] event execution failed.



Аналогично цпу улетел под 100% как раз в 6.22 примерно.

Походу придется отказываться от галера кластера.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101986
hck2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
убедись, что это те же апдейты, а не в другое место проблема переместилась и убедись, что ушли фуллсканы.
...
Рейтинг: 0 / 0
Очередной вопрос про "lock wait timeout exceeded"
    #40101993
xeonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hck2,

Ну по логам сбойнул тут же скрипт из шедулера, он там у меня один, других нет. В логах других серверов чисто, проц не грузит, хотя база тоже встает.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очередной вопрос про "lock wait timeout exceeded"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]