Автоочистка для предотвращения зацикливания счетчиков
Сервер автоматически предупреждает развитие ситуации, которая могла бы привести к обороту (зацикливанию) счетчика транзакций. Таблицы с истекающим максимальным «сроком хранения» записей будут принудительно заморожены, даже если автоочистка выключена на уровне сервера или таблицы. Пороги здесь измеряются в абсолютных единицах счетчиков транзакций.
Параметр | Назначение | По умолчанию |
---|---|---|
autovacuum_freeze_max_age | Максимальный возраст среди транзакций таблицы, pg_class.relfrozenxid | 200 миллионов транзакций |
autovacuum_multixact_freeze_max_age | Максимальный возраст среди мультитранзакций таблицы, pg_class.relminmxid | 400 миллионов мультитранзакций |
Эти два вида принудительной автоочистки будут запущены postmaster
в любом случае. Для предотвращения инцидента сервер в этом случае не подчинится ни параметру autovacuum = off
, ни соответс твующим точным настройкам таблицы или TOAST.
Таблица на время принудительной заморозки будет полностью заблокирована для чтения и записи.
Оба параметра могут быть настроены только на уровне сервера для всех баз кластера. Их также можно перекрыть на уровне каждой из таблиц в параметрах хранения.
Пороги по умолчанию выбраны достаточно «тесными» — менее 10% и 20% от общего пространства транзакций и мультитранзакций соответственно, что составляет 231 значение. Это сделано для того, чтобы урезать хранимый в памяти и на диске массив статусов транзакций clog. Производительность каждой операции поиска в этом массиве зависит от его объема, а эти операции выполняются при каждом выяснении видимости записи по незавершенным транзакциям.
Несмотря на важную цель этой очистки и максимальный уровень блокировки затронутой таблицы, принудительная заморозка подчиняется настройкам «вежливого» режима автоочистки всегда, вплоть до версий ядра PostgreSQL 15 (Pangolin 6.0+).