Перейти к основному содержимому

Автоочистка для предотвращения зацикливания счетчиков

Сервер автоматически предупреждает развитие ситуации, которая могла бы привести к обороту (зацикливанию) счетчика транзакций. Таблицы с истекающим максимальным «сроком хранения» записей будут принудительно заморожены, даже если автоочистка выключена на уровне сервера или таблицы. Пороги здесь измеряются в абсолютных единицах счетчиков транзакций.

ПараметрНазначениеПо умолчанию
autovacuum_freeze_max_ageМаксимальный возраст среди транзакций таблицы, pg_class.relfrozenxid200 миллионов транзакций
autovacuum_multixact_freeze_max_ageМаксимальный возраст среди мультитранзакций таблицы, pg_class.relminmxid400 миллионов мультитранзакций

Эти два вида принудительной автоочистки будут запущены postmaster в любом случае. Для предотвращения инцидента сервер в этом случае не подчинится ни параметру autovacuum = off, ни соответствующим точным настройкам таблицы или TOAST.

Таблица на время принудительной заморозки будет полностью заблокирована для чтения и записи.

Оба параметра могут быть настроены только на уровне сервера для всех баз кластера. Их также можно перекрыть на уровне каждой из таблиц в параметрах хранения.

Пороги по умолчанию выбраны достаточно «тесными» — менее 10% и 20% от общего пространства транзакций и мультитранзакций соответственно, что составляет 231 значение. Это сделано для того, чтобы урезать хранимый в памяти и на диске массив статусов транзакций clog. Производительность каждой операции поиска в этом массиве зависит от его объема, а эти операции выполняются при каждом выяснении видимости записи по незавершенным транзакциям.

Несмотря на важную цель этой очистки и максимальный уровень блокировки затронутой таблицы, принудительная заморозка подчиняется настройкам «вежливого» режима автоочистки всегда, вплоть до версий ядра PostgreSQL 15 (Pangolin 6.0+).