Как предотвратить обновление материализованных представлений во время восстановления pg?

Я создал дамп базы данных, используя pg_dump в" пользовательском " формате (- Fc). Этот формат позволяет вызывать pg_restore с параметром "jobs" (- j8). Параметры заданий запускают 8 процессов и восстанавливают подавляющее большинство отношений в моей базе данных в течение 10 минут.

у меня осталось 4 процесса. Одним из них является обновление материализованного представления, а другие 3-индексы, применяемые к 3 таблицам, которые материализованное представление использует в качестве источников данных. Индекс "ждут" в соответствии с pg_stat_activity, предположительно, потому что REFRESH материализованного представления по-прежнему обращается к исходным таблицам.

когда индексы находятся на месте, обновление представления занимает всего пару минут. Потому что индексы не находятся на месте во время REFRESH, Я вырезал REFRESH процесс выключен в 17 часов, что привело к сбою pg_restore.

как я могу

  1. Force порядок элементов, так что индексы создаются первый
  2. выключите обновление материализованного вида и сделайте это вручную позже
  3. манипулируйте файлом дампа в пользовательском формате, чтобы сказать"без данных"
  4. Перехват REFRESH MATERIALIZED VIEW заявление и бросить его в мусорное ведро

или любое другое решение, которое получает работу?

3 ответов


David G Johnston опубликовал ответ для меня в списке рассылки pgsql-hackers.

" есть / можете ли вы попробовать опции '-l (el) & -L' для pg_restore?

http://www.postgresql.org/docs/9.3/static/app-pgrestore.html

(пример использования в нижней части страницы)

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

pg_dump/pg_restore следует научить обрабатывать это лучше, что является основным причина, по которой Крейг отправил вас сюда как можно скорее, но пока он работает потребуется ручное вмешательство. Теоретически возможности "листинга" должно позволить вам делать то, что вам нужно."

Я думаю, что это (pg_restore-l | pg_restore-L) приведет меня туда, где мне нужно пойдите сейчас, вставив небольшой сценарий оболочки между ними, который толкает материализованные представления до конца список, но тогда мне тоже придется управление собственными зависимостями для элементов, которые я повторно сортирую (MatViews of MatViews). Это довольно серьезно ограничивает полезность материализованных взглядов для меня. Для версии 9.3.x, мне, вероятно, потребуются зависимости MatView не более 1 глубокий.

изменить: Чтобы остановить материализацию данных при восстановлении, я начал делать следующее:

pg_dump mydatabase -Fd backup_dir
pg_restore -l  -Fd backup_dir | sed '/MATERIALIZED VIEW DATA/d' > ordered.lst
pg_restore -L ordered.lst -Fd backup_dir mydatabase

Это удаляет REFRESH MATERIALIZED VIEW операторы из restore. Спасибо Дэвиду Дж. Джонстону за советы.


в качестве дополнения к принятому ответу, как только все индексы закончатся и / или вы запустите ANALYZE, вы можете обновить материализованные представления в правильном порядке (зависимости), используя:

pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst
pg_restore -L refresh.lst -Fd backup_dir mydatabase

один обходной путь, вы можете попробовать.

возможно, вы можете создать MatViews в отдельной схеме, посвященной им. Для обратной совместимости можно использовать синонимы.

pg_restore может использоваться только схемой.