Если во время работы сервиса добавить в таблицу столбец или индекс, из-за одной кратковременной блокировки могут встать все запросы к этой таблице.
Почему Хотфиксом в рабочую таблицу добавляется столбец или индекс → Следствие Изменение схемы ждёт ранее открытую длинную транзакцию, а все следующие запросы ждут изменение схемы → На экране Функции, которые используют эту таблицу (инвентарь, почта и т. п.), полностью перестают работать, запросы завершаются по таймауту
Основной ответственный Команда инфраструктуры · Инфраструктура БД · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Хотфиксы с изменением схемы согласовывать по срокам с инфраструктурой БД, сначала деплоить код, который работает и без нового столбца.
Команда инфраструктуры: задачи
Ставить короткий лимит ожидания блокировки и при сбое повторять, запускать, когда нет длинных транзакций, использовать инструменты онлайн-изменения схемы, большие таблицы менять во время техработ.
На графике
Ступенька вверх с определённого момента · число сессий в ожидании блокировки, задержка запросов к этой таблице
Где смотреть
В MySQL считать сессии с State Waiting for table metadata lock в SHOW PROCESSLIST и искать блокирующую сессию (blocking_pid) через sys.schema_table_lock_waits. В PostgreSQL смотреть запросы, у которых granted равно false, и AccessExclusiveLock в pg_locks и искать блокирующую сессию через pg_blocking_pids()
Подтверждает
С момента запуска изменения схемы все запросы к этой таблице копятся в ожидании блокировки, а в начале очереди стоит незавершённая транзакция или оператор изменения схемы
Опровергает
Если ожидания сосредоточены только на определённых строках, а остальные строки той же таблицы обрабатываются нормально, это горячая строка (db-hot-row)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
При изменении схемы MySQL ненадолго берёт блокировку метаданных, а PostgreSQL самую сильную блокировку таблицы. Само изменение мгновенное, но если перед ним висит одна незавершённая транзакция, все запросы за ним встают в очередь.
Источники
Online DDL Performance and ConcurrencyMySQL Даже онлайн-DDL в конце ненадолго требует эксклюзивную блокировку метаданных. Если есть длинная транзакция, DDL её ждёт, а ожидающий запрос блокировки задерживает все последующие транзакции
Server System VariablesMySQL lock_wait_timeout: лимит ожидания блокировки метаданных, по умолчанию 31 536 000 секунд (1 год)