|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
После перевода базы с MyISAM на InnoDB и построения кластера galera из трех нод стал периодически (раз в несколько дней) получать проблему того, что весь кластер встает колом и на одном из серверов (первоначальном) в логах сыпет Код: sql 1. 2. 3. 4.
При этом процесс mysql на этом сервере жрет весь процессор, даже не могу подключится ни через phpmyadmin, ни через консоль. service mariadb stop долго ждет, потом выдает "не удалось остановить". Помогает только kill -9 [pid-mysql] и рестарт сервера заново. Как я понимаю, подвисает скрипт из шедулера finish_stale_sessions2 (выполняется раз в час), который довольно простой: Код: sql 1.
Его смысл - поменять пару столбцов в некоторых строках. В эту же таблицу идет поток insert'ов примерно до нескольких штук в секунду (суммарно по всех трем серверам в кластере). Я не пойму как все это отдебажить и почему оно вообще возникает. Ранее был единственный сервер и база была в MyISAM, ни разу такой проблемы не было. Никаких сложных транзакций в базе нет, размер базы ~1Гб, в проблемной таблице сейчас около 1 млн строк. Update из скрипта пытается поменять ну от силы несколько сотен строк за раз. Больше всего печалит, что колом встает весь кластер, при этом каких то ошибок в логах на других серверах нет. Есть какие то мысли, как понять причину? Правильно ли я понимаю, что скрипт не успевает уложиться в дефолтные 50сек и делает рестарт? Поможет ли увеличение этого лимита и сколько его надо сделать? Для теста сейчас выполнил запрос из скрипта руками (уменьшив INTERVAL, чтобы взять больше строк для изменения): Код: sql 1. 2. 3.
0.61 сек, откуда вдруг берется таймаут в 50 сек, я не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 10:12 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
Сделай сперва SELECT .. FOR UPDATE, а потом сразу UPDATE. Надеюсь, индекс (acctstoptime, acctupdatetime) имеется? xeonz как понять причину? Ну как... у тебя идут внешние запросы, которые потенциально могут интерферировать с твоим запросом на обновление. Вот и начинается прыготня с блокировками. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 10:36 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
авторСделай сперва SELECT .. FOR UPDATE, а потом сразу UPDATE. Akina, Я правильно понял, что мой скрипт должен выглядеть так? Код: sql 1. 2.
Я не силен в базах данных и не особо понимаю, каким образом этот select for update может помочь. авторНадеюсь, индекс (acctstoptime, acctupdatetime) имеется? Скорее всего нет. Есть смысл добавить? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:15 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
xeonz не особо понимаю, каким образом этот select for update может помочь. Запрос FOR UPDATE блокирует выбранные записи. И соответственно следующий запрос не наткнётся на изменения от других запросов и необходимость ждать. xeonz Скорее всего нет. Есть смысл добавить? Полагаю, в его наличии есть смысл - без него Вы получаете скан таблицы, а не отбор по индексу. В любом случае, надо смотреть изменение плана выполнения и производительности запроса, но думаю, что при селективности в 10к выигрыш будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 11:34 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
Akina [ Запрос FOR UPDATE блокирует выбранные записи. И соответственно следующий запрос не наткнётся на изменения от других запросов и необходимость ждать. В какой момент снимается блокировка? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 13:56 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
xeonz В какой момент снимается блокировка? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2021, 18:33 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
Akina xeonz В какой момент снимается блокировка? Если я скрипт (ивент) вот так оформил - корректно получилось? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 11:15 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
Ну вроде на первый взгляд более-менее нормально... протестируй. Правда, смущает использование CURRENT_TIME() - оно ж разное в двух последовательных запросах. Tак что я бы сперва откатился во времени в переменную Код: sql 1.
а потом её использовал, чтобы гарантировать одну и ту же точку времени в обоих запросах. И потом - эта функция же возвращает чисто время... вот точно не надо вместо него использовать дату-время? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 14:03 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
xeonz Скорее всего нет. Есть смысл добавить? если индекса нет, чудо mysql зачем-то ставит блокировки абсолютно на все записи таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2021, 19:28 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
hck2 xeonz Скорее всего нет. Есть смысл добавить? если индекса нет, чудо mysql зачем-то ставит блокировки абсолютно на все записи таблицы. Интересно. Добавил индекс по одному из столбцов (по другому уже был). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2021, 09:49 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
Akina И потом - эта функция же возвращает чисто время... вот точно не надо вместо него использовать дату-время? Ну в таком виде все работает как надо, выбираются именно те записи (старше, чем последние 720 минут по этому столбцу с датой-временем), которые мне надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2021, 09:51 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
xeonz Интересно. Добавил индекс по одному из столбцов (по другому уже был). теперь и select for update не нужен. с индексами у него проснется совесть и будет лочить только то, что необходимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2021, 10:28 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
К сожалению все это не помогло, сегодня опять все встало: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Аналогично цпу улетел под 100% как раз в 6.22 примерно. Походу придется отказываться от галера кластера. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2021, 09:17 |
|
Очередной вопрос про "lock wait timeout exceeded"
|
|||
---|---|---|---|
#18+
убедись, что это те же апдейты, а не в другое место проблема переместилась и убедись, что ушли фуллсканы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2021, 09:34 |
|
|
start [/forum/topic.php?fid=47&msg=40101983&tid=1827927]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
154ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 260ms |
0 / 0 |