Выбор ответа Senior Транзакции и изоляция обновлено

Зачем нужна заморозка и что такое wraparound

Вопрос

Почему autovacuum в PostgreSQL обязательно должен «замораживать» старые строки, даже если их никто не меняет?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Счётчик транзакций 32-битный и идёт по кругу. Видимость версии строки определяется номерами транзакций xmin/xmax, а счётчик 32-битный, и сравнение идёт по модулю: «в прошлом» примерно 2 млрд номеров, и без заморозки старые строки однажды покажутся «из будущего».

Варианты ответа

  1. Счётчик транзакций 32-битный и идёт по кругуправильный ответ
  2. Заморозка сжимает старые строки и экономит место на диске
  3. Без заморозки старые строки нельзя прочитать через индекс
  4. Заморозка нужна для логической репликации старых данных

Разбор

Видимость версии строки определяется номерами транзакций xmin/xmax, а счётчик 32-битный, и сравнение идёт по модулю: «в прошлом» примерно 2 млрд номеров, и без заморозки старые строки однажды покажутся «из будущего». Заморозка помечает старые версии как видимые всем, после чего их номер уже не важен. Если заморозка не успевает (её блокирует, например, долгая транзакция или забытый слот репликации), PostgreSQL сначала пишет предупреждения, а около предела перестаёт выдавать новые номера транзакций, чтобы не потерять данные: запись стоит до ручного VACUUM. Следят за age(datfrozenxid) в pg_database. Место заморозка не экономит, на индексы и репликацию не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме