DBAtlas · Атлас эксплуатации баз данных

Найти держателей горизонта xmin, мешающих VACUUM удалять мёртвые кортежи

PostgreSQLОбслуживание

Команда

SELECT 'session' AS source, pid::text AS id, usename::text AS owner, state AS detail,
       age(backend_xmin) AS xmin_age
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL AND pid <> pg_backend_pid()
UNION ALL
SELECT 'prepared_xact', gid, owner::text, prepared::text, age(transaction)
FROM pg_prepared_xacts
UNION ALL
SELECT 'replication_slot', slot_name::text, slot_type, active::text,
       greatest(age(xmin), age(catalog_xmin))
FROM pg_replication_slots
WHERE xmin IS NOT NULL OR catalog_xmin IS NOT NULL
UNION ALL
SELECT 'standby_feedback', application_name, usename::text, state, age(backend_xmin)
FROM pg_stat_replication
WHERE backend_xmin IS NOT NULL
ORDER BY xmin_age DESC NULLS LAST;

Что делает

Выводит, упорядочив по возрасту xmin, четыре источника, которые могут блокировать очистку мёртвых кортежей: сессии, удерживающие снимки, prepared transactions, слоты репликации и standby, отправляющие hot_standby_feedback.

Когда использовать

Когда VACUUM VERBOSE сообщает 'dead row versions cannot be removed yet', раздувание продолжает расти, а возраст XID не снижается.

Внимание

Самый старый xmin определяет горизонт очистки; слоты репликации и обратная связь от standby влияют на все базы данных. Prepared transactions переживают перезапуски; проверьте владельца и закройте их через COMMIT PREPARED / ROLLBACK PREPARED '<gid>'. Удаление неиспользуемого слота ломает его потребителя (standby, CDC); сначала проверьте владельца. При запуске на standby показывает только сессии этого standby.

Открыть в DBAtlas →

Связанные материалы