Postgres autovacuum high cpu/disk после импорта базы данных

Я перенес базу данных Postgres 9.4 объемом 2 ТБ с одного сервера на другой, и после импорта автовакуум несколько дней сходит с ума из-за высокой загрузки процессора и диска. База данных содержит более 40 000 схем/таблиц.

Я попытался закрыть базу данных и перезапустить ее, но все еще активно. Раньше у меня были проблемы с вакуумом после импорта, похоже, это обычная проблема Postgres, есть ли способ ее решить? База данных, которая была экспортирована, была в порядке, проблем с вакуумом не было, похоже, это было вызвано импортом.

Я старался:

vacuumdb --all --full -w

Но если не удалось завершить из-за тайм-аута оператора. Есть ли какое-нибудь решение, кроме отключения автоочистки?

г


person James    schedule 24.08.2019    source источник
comment
Какая минорная версия 9.4?   -  person jjanes    schedule 24.08.2019
comment
Для меня импорт и миграция - разные вещи. Можете ли вы объяснить, что вы на самом деле сделали? Вы объединяете данные из двух разных кластеров в один кластер, используя pg_dump ...| psql ...?   -  person jjanes    schedule 24.08.2019
comment
Vacuumdb --all --full -w опция --full почти наверняка является ошибкой.   -  person jjanes    schedule 24.08.2019
comment
экспорт из одной базы pg_dumpall и импорт в другую psql...   -  person James    schedule 25.08.2019
comment
так вакуумдб --все -w лучше? Почему?   -  person James    schedule 25.08.2019
comment
так вакуумдб --все -w лучше? Почему? Это не бессмысленно перезаписывает всю базу данных. Вы только что написали вещь с помощью psql -f ..., зачем еще раз переписывать ее, используя vacuumdb --full?   -  person jjanes    schedule 25.08.2019


Ответы (1)


База данных должна заново создать статистику и карту видимости после импорта. Так что это ожидаемое поведение. Если вы не запустите VACUUM вручную или отключите автоочистку, то Postgres не будет работать эффективно.

Экспорт — это операция чтения, VACUUM делать не нужно. Если вы импортируете данные объемом 2 ТБ, ожидается высокая загрузка ЦП и операций ввода-вывода, пока не будет выполнено VACUUM. Вы можете запустить VACUUM вручную (с более высокой скоростью), но он не должен давать сбоев из-за таймаутов (вам следует увеличить таймауты).

person Pavel Stehule    schedule 24.08.2019
comment
Наконец, после 4-го дня вакуумной очистки диска / процессора, он наконец успокоился. Обратите внимание: мне приходилось перезагружать базу данных каждое утро, иначе она оставалась бы высокой. - person James; 25.08.2019
comment
Есть ли способ, чтобы это не занимало 4 дня? требуется вакуумная база данных --all --full -w? - person James; 25.08.2019
comment
@James - 4 дня выглядят слишком долго - возможно, что-то не так - ошибка Postgres, слишком медленный ввод-вывод, слишком мало памяти, ... может быть, 40 000 объектов являются проблемой для вакуумной базы данных, возможно, некоторые системные таблицы раздуты. Скорость VACUUM сильно зависит от количества индексов. Если вы можете уменьшить индексы, вы можете уменьшить необходимое время. - person Pavel Stehule; 25.08.2019