한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L12 База данных

Блокировка при изменении схемы (DDL) на работающем сервисе Schema change lock (DDL / metadata lock)

ID причины db-ddl-lock · Основной ответственный Команда инфраструктуры · Инфраструктура БД · Совместно Команда разработки · Разработка сервера

Открыть карточку в основной версии с иллюстрациями и экспериментами →

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

Почему Хотфиксом в рабочую таблицу добавляется столбец или индекс → Следствие Изменение схемы ждёт ранее открытую длинную транзакцию, а все следующие запросы ждут изменение схемы → На экране Функции, которые используют эту таблицу (инвентарь, почта и т. п.), полностью перестают работать, запросы завершаются по таймауту

Симптомы
Задержка ввода, Съеденные действия / роллбэк, Ошибка входа / бесконечная загрузка
Факторы
Остановка
У кого
Только одна функция, Весь сервер
Когда
Изредка, случайно, Сразу после входа или техработ
Ответственные
Основной ответственный Команда инфраструктуры · Инфраструктура БД · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Хотфиксы с изменением схемы согласовывать по срокам с инфраструктурой БД, сначала деплоить код, который работает и без нового столбца.
Команда инфраструктуры: задачи
Ставить короткий лимит ожидания блокировки и при сбое повторять, запускать, когда нет длинных транзакций, использовать инструменты онлайн-изменения схемы, большие таблицы менять во время техработ.
На графике
Ступенька вверх с определённого момента · число сессий в ожидании блокировки, задержка запросов к этой таблице
Где смотреть
В 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 самую сильную блокировку таблицы. Само изменение мгновенное, но если перед ним висит одна незавершённая транзакция, все запросы за ним встают в очередь.

Источники

  1. Online DDL Performance and Concurrency MySQL
    Даже онлайн-DDL в конце ненадолго требует эксклюзивную блокировку метаданных. Если есть длинная транзакция, DDL её ждёт, а ожидающий запрос блокировки задерживает все последующие транзакции
  2. Server System Variables MySQL
    lock_wait_timeout: лимит ожидания блокировки метаданных, по умолчанию 31 536 000 секунд (1 год)
  3. ALTER TABLE (PostgreSQL Documentation) PostgreSQL
    ALTER TABLE без явного указания режима берёт самую сильную блокировку ACCESS EXCLUSIVE
  4. Client Connection Defaults (PostgreSQL Documentation) PostgreSQL
    lock_timeout: если ожидание блокировки дольше этого времени, оператор прерывается
  5. General Thread States MySQL
    Waiting for table metadata lock: состояние потока, который ждёт блокировку метаданных
  6. The schema_table_lock_waits and x$schema_table_lock_waits Views MySQL
    Сессия, которая ждёт блокировку метаданных (waiting_query), и блокирующая сессия (blocking_pid)
  7. pg_locks (PostgreSQL Documentation) PostgreSQL
    granted равно false: идёт ожидание блокировки, в mode тип блокировки, например AccessExclusiveLock
  8. System Information Functions and Operators (PostgreSQL Documentation) PostgreSQL
    pg_blocking_pids(): список сессий, которые не дают указанной сессии получить блокировку

Смотрите также

Тот же слой: L12 База данных

Причины с тем же симптомом (Задержка ввода) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами