Автоочистка уступила место другой операции
«ERROR: canceling autovacuum task» в журнале PostgreSQL: автоочистка таблицы прервана, потому что другой запрос запросил конфликтующую блокировку. Обычно это нормально, но если повторяется на одной таблице, она перестаёт чиститься.
Что это значит
Автоочистка (autovacuum) держит на таблице мягкую блокировку и уступает, когда кто-то просит конфликтующую: ALTER TABLE, TRUNCATE, LOCK TABLE, REINDEX, CREATE INDEX без CONCURRENTLY. PostgreSQL отменяет автоочистку и пишет эту запись, а рядом DETAIL с именем таблицы.
Разовая отмена безвредна: автоочистка вернётся к таблице позже. Опасно, когда её отменяют на одной таблице раз за разом: мёртвые строки копятся, таблица разрастается, а в худшем случае подходит угроза wraparound.
Как проверить
SELECT relname, n_dead_tup, last_autovacuum, last_vacuum
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 10;
Если у таблицы из журнала давно нет last_autovacuum и много n_dead_tup, её не успевают чистить.
Что сделать
- Найти, какая операция регулярно берёт конфликтующую блокировку на этой таблице, и развести её по времени с автоочисткой.
- Почистить таблицу вручную в спокойное время:
VACUUM (VERBOSE) <таблица>;. РучнойVACUUMне уступает чужим блокировкам, как автоочистка, поэтому для таблиц, которые постоянно прерывают, его стоит запланировать в окно обслуживания.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать