#postgresql #autovacuum
#postgresql #автовакуум
Вопрос:
У меня есть база данных, где в одной таблице у меня более 8 миллионов вставок каждый день (записи распределяются по времени, примерно 90-100 в секунду).
И каждый день я удаляю все записи старше 7 дней, но дисковое пространство для таблицы не перестает расти.
Автовакуум «включен» в конфигурации по умолчанию. Запрос на удаление выполнен в 2:55 ночи. Последний автовакуум для стола примерно через 3 часа в 6:32, второго запуска нет.
Почему дискового пространства каждый день становится примерно на 1 гб больше?
Теперь autovacuum не освобождает дисковое пространство сразу, но я могу использовать удаленные строки для новых вставок.
Прямо сейчас кажется, что я удаляю записи, но я не использую свободное пространство для новых, и таблица продолжает расти.
Каждый день после удаления старых записей в таблице остается около 50 миллионов строк, и они почти не отличаются от сохраненного размера.
Возможно ли, что Postgres хочет достичь определенного размера для таблицы, которой, по его мнению, он может манипулировать без проблем? Я не пробую это, потому что свободного места не так много, и когда пространство заполнено, я TRUNCATE
закрываю таблицу.
Ответ №1:
Вы имеете в виду размер таблицы, а не объем памяти, верно?
Во-первых, некоторые общие моменты, которые вы должны проверить, чтобы определить проблему:
Установите log_autovacuum_min_duration
значение, отличное от -1, и посмотрите, генерируются ли сообщения.
Следите за процессами autovacuum в pg_stat_activity
. Есть ли какие-либо запущенные в вашей проблемной таблице?
Изучите выходные данные
SELECT * FROM pg_stat_user_tables
WHERE relname = 'prablemtable';
Что такое n_live_tup
и n_dead_tup
?
Что такое autovacuum_count
и last_autovacuum
?
Я подозреваю, что autovacuum запущен, но не может выполнять свою работу, потому что одна из этих трех причин мешает его очистке:
-
Длительные транзакции в состоянии
idle in transaction
. -
Устаревшие слоты для репликации.
-
Потерянные подготовленные транзакции.