Автовакуум большого стола занимает слишком много времени
Я обновил свой кластер 9.4 postgresql до 9.6. (через pg_upgrade, поэтому моя статистика БД не была перемещена в новый кластер) У меня есть большая таблица (около 450M записей). Эта таблица очень часто используется в моем коде (много отборов и меньше взлетов). Когда я запускаю службу postgres, Postgres автоматически запускает автоочистку, чтобы заблокировать мой стол. Поэтому я ничего не могу сделать: ни обрезать таблицу, ни проанализировать ее вручную. Я попытался установить autovacuum = off в моем конфигурационном файле, но это не помогло (почему?! Я, конечно, перезапустил сервер)
ОБНОВЛЕНИЕ: Моя цель состоит в том, чтобы начать использовать таблицу как можно скорее. Поможет Truncate (так как таблица будет пустой), ANALYZE должен помочь (Postgres начнет использовать правильные индексы)
Какой самый быстрый способ: 1) обрезать таблицу или 2) проанализировать таблицу? Любая помощь приветствуется.
ОБНОВЛЕНИЕ: Вот результат запроса для просмотра блокировок:
SELECT psa.pid,granted,query FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid where locktype='relation';
pid | granted | query
-------+---------+---------------------------
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
11831 | t | autovacuum: VACUUM ANALYZE public.ig_tasks_users (to prevent wraparound)
Когда я анализирую таблицу из моей консоли psql и вижу данные из pg_stat_activity:
query | backend_start | xact_start | query_start | state_change | state | wait_event_type | wait_event
analyze ig_tasks_users;| 2017-01-19 10:03:30.287791+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683817+01 | 2017-01-19 10:07:11.683822+01 | active | Lock | relation
Если я правильно понимаю, мой VACUUM ANALYZE блокирует таблицу, и мои задачи ANALYZE вручную блокируются. (Это правильно?)
3 ответа
Запустите truncate в одном сеансе и оставьте его работать, затем откройте новое соединение и завершите все остальные сеансы pg_terminate_backend(pid)
, Иметь ввиду
truncate
сотрет все ваши данные из таблицы- автовакуум лучше на
Если автоматический вакуум занимает слишком много времени, это может быть потому, что вы отключили его на некоторое время.
Обычная цель обычной уборки пылесоса состоит в том, чтобы делать стандартные ВАКУУМЫ достаточно часто, чтобы избежать необходимости ВАКУУМНОГО ПОЛНОГО. Демон autovacuum пытается работать таким образом и фактически никогда не выдаст VACUUM FULL.
Решение медленного вакуума состоит в том, чтобы пылесосить чаще! Также обратите внимание, что установка автоматического выключения может не полностью отключить его.