Я управляю большой (несколько сотен гигов) базой данных, содержащей таблицы с различными ролями, некоторые из которых содержат миллионы записей. Некоторые таблицы получают только большое количество вставок и удалений, другие - только несколько вставок и большое количество обновлений.
База данных работает на PostgreSQL 8.4 в системе Debian 6.0 amd64 с 16 гигабайтами оперативной памяти.
Иногда вопрос заключается в том, что процесс автоочистки на столе занимает очень много времени (дней). Я хочу иметь возможность приблизительно сказать, сколько времени займет конкретная команда вакуума, чтобы иметь возможность решить, отменять ли ее или нет. Также, если бы был индикатор прогресса для вакуумных операций postgres, это было бы очень полезно.
Редактировать:
Я не ищу пуленепробиваемого решения. Достаточно приблизительного подсчета количества мертвых кортежей или необходимых байтов ввода / вывода, чтобы принять решение. Это действительно раздражает, когда ты не знаешь, когда VACUUM
закончишь.
Я видел, что pg_catalog.pg_stat_all_tables
есть столбец для количества мертвых кортежей. Таким образом, можно получить оценку, даже если это означает, что нужно идти к ANALYZE
столу раньше. С другой стороны, autovacuum_vacuum_threshold
и autovacuum_vacuum_scale_factor
одни только настройки доказывают, что сам Postgres знает кое-что о количестве изменений в таблицах и, вероятно, передает его в руки администратора баз данных.
Я не уверен, какой запрос выполнить, потому что когда я запускаю VACUUM VERBOSE
, я вижу, что обрабатываются не только таблицы, но и индексы по ним.
источник
VACUUM FULL
на 9.0+, так как полностью переписывает таблицу. Это должно работать для обычногоVACUUM
тоже, но я еще не проверял это. Ибоautovacuum
это сработало бы, если бы вы могли поймать рабочий процесс autovacuum на заданной таблице, но я не знаю, как этого добиться.Это очень сложно определить. Вы можете настроить автоочистку чтобы она была более агрессивной или более мягкой. Но если установить значение «мягкий» и оно отстает, а базовая нагрузка ввода-вывода слишком высока, может случиться так, что он никогда не достигнет надлежащего вакуумированного состояния - тогда вы увидите, что процесс работает, работает и работает. Кроме того, более поздние выпуски PostreSQL имеют значительно улучшенные возможности автоочистки, одного этого может быть достаточно, чтобы перейти к одному из них (предпочтительно 9.2 как самый последний).
Индикатор выполнения звучит неплохо, но я думаю, что реализовать его не так просто. Поскольку у вас постоянная нагрузка на ваши таблицы, вполне возможно, что прогресс явно движется в обратном направлении (я имею в виду, что число / процент мертвых строк увеличивается, а не уменьшается) - тогда какой вывод вы сделаете?
источник
VACUUM ANALYZE VERBOSE
по крайней мере, выводит какую-то активность на консоль, как она это делает. Лучше просто смотреть на статичные подсказки, задаваясь вопросом, не застряло ли что-то часами.VACUUM
Вышесказанное полезно только для , а не для автовакуума, но это все же что-то.В нашем производстве одна из самых больших таблиц имела этот журнал:
Это, безусловно, худшее потребление ресурсов, все другие таблицы заняли менее 2 с.
Чтобы увидеть эти типы журналов, вы должны выполнить это:
(в течение 5 мс) перезагрузите файл конфигурации.
источник
Я нашел этот пост и этот пост полезным, но, как уже упоминали другие, может быть трудно рассчитать общий прогресс вакуума, так как процесс включает в себя несколько отдельных операций.
Я использую этот запрос для отслеживания прогресса сканирования таблиц в вакууме, что, кажется, является основной частью работы:
Однако это не включает сканирование индекса, которое происходит впоследствии, и может занять столько же времени, если не больше, если у вас есть тонна индексов. К сожалению, я не могу найти способ контролировать индекс сканирования / очистки.
источник