Делает ли отмена (AUTO) процесса VACUUM в PostgreSQL бесполезной вся работа?

13

В некоторых случаях, и после создания массива update, insertили deleteиз таблицы, я начал, VACUUM FULL ANALYZEчтобы убедиться, что БД не стала слишком раздутой. Выполнение этого в производственной базе данных позволило мне обнаружить, что это не очень хорошая идея, потому что я мог заблокировать таблицу на длительный период времени. Итак, я отменил процесс, может быть, попробовал просто VACUUM(не полный) или позвольте AUTOVACUUMсделать позже все, что он может сделать.

Вопрос заключается в следующем: если я остановлю VACUUM или AUTOVACUUM на полпути, потеряна ли уже вся обработка?

Например, если VACUUMуже найдено 1 М мертвых строк, и я остановил это, вся эта информация потеряна? Работает ли VACUUM полностью транзакционным способом («все или ничего», как очень большое количество процессов PostgreSQL)?

Если VACUUM можно безопасно прервать без потери всей работы, есть ли способ сделать vacuumработу постепенно? [Работать в течение 100 мс, остановиться, подождать 10 мс, чтобы разрешить неблокирование остального мира ... и т. Д.]. Я знаю, что вы можете сделать часть этого, настраивая параметры автоочистки, но я думаю о том, чтобы иметь возможность программно управлять этим, чтобы иметь возможность делать это в определенное время / при определенных условиях.


ПРИМЕЧАНИЕ. Остановить / отменить / убить процесс означает в этом контексте:

  • При использовании pgAdmin нажмите кнопку «Отменить запрос».
  • Если вы работаете программно, вызовите pg_cancel_backend ().

Я предполагаю, что оба эквивалентны. Я не использовал команду уничтожения на уровне оболочки или системы.

joanolo
источник

Ответы:

8

Работа, выполненная прерванным VACUUM FULL, будет полностью потеряна, поскольку она просто вернется к использованию предыдущей версии таблицы и выбросит текущую версию таблицы.

Работа, выполненная обычным (не ПОЛНЫМ) ВАКУУМОМ, может быть не полностью потеряна. Он очищает индексы партиями, и любые партии, которые были полностью очищены, не нужно будет очищать снова. Их все равно нужно будет снова осмотреть, но в следующий раз они будут уже очищены. Таким образом, вы можете сохранить некоторые записи ввода-вывода, которые не нужно будет повторять.

jjanes
источник
1
Хотелось бы более подробно об этом, особенно об автовакууме. У меня есть занятые серверы со многими базами данных, и иногда автовакуумы могут занимать много времени. Когда это происходит, создание нового индекса, например, невозможно, потому что в автовакууме есть блокировка. В некоторых случаях было бы идеальным убить автовакуум и применить индекс, а затем, надеюсь, когда автозапуск снова запустится, он не должен работать почти так же долго. Любой способ увидеть детали того, что autovacuum сделал / делает с таблицей и индексами?
Курт Коллер
3
9.6 представил представление для мониторинга прогресса вакуума: postgresql.org/docs/current/static/progress-reporting.html . Я сам не поиграл с этим, поэтому не знаю, насколько хорошо это сработает для вас. Автовакуум должен поддаваться замку автоматически, если это не делается для циклического поворота. Настройки по умолчанию для автовакуума сильно регулируются, поэтому в следующий раз он может не работать быстрее только из-за того, что его регулируют с той же скоростью. Я обычно устанавливаю vacuum_cost_page_hitи vacuum_cost_page_missна ноль.
Джанес