Зачем нужна заморозка и что такое wraparound
Вопрос
Почему autovacuum в PostgreSQL обязательно должен «замораживать» старые строки, даже если их никто не меняет?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Счётчик транзакций 32-битный и идёт по кругуправильный ответ
- Заморозка сжимает старые строки и экономит место на диске
- Без заморозки старые строки нельзя прочитать через индекс
- Заморозка нужна для логической репликации старых данных
Разбор
Видимость версии строки определяется номерами транзакций xmin/xmax, а счётчик 32-битный, и сравнение идёт по модулю: «в прошлом» примерно 2 млрд номеров, и без заморозки старые строки однажды покажутся «из будущего». Заморозка помечает старые версии как видимые всем, после чего их номер уже не важен. Если заморозка не успевает (её блокирует, например, долгая транзакция или забытый слот репликации), PostgreSQL сначала пишет предупреждения, а около предела перестаёт выдавать новые номера транзакций, чтобы не потерять данные: запись стоит до ручного VACUUM. Следят за age(datfrozenxid) в pg_database. Место заморозка не экономит, на индексы и репликацию не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Advisory-блокировки в PostgreSQL
- Как избежать deadlock при переводах
- Взаимоблокировки: как ловить и предотвращать
- Долгая транзакция и раздувание таблиц
- MVCC и VACUUM в PostgreSQL
- Уровень изоляции по умолчанию в PostgreSQL
- Как обеспечивается Durability
- ACID