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

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

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

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

Как я могу

  • Настроить порядок элементов, чтобы индексы сначала создавались
  • Отключите обновление материализованного представления и сделайте это вручную позже
  • Манипулировать файл дампа в пользовательском формате, чтобы сказать "БЕЗ ДАННЫХ"
  • Перехватите оператор REFRESH MATERIALIZED VIEW и выбросьте его в корзину

Или любое другое решение, которое выполняет свою работу?

Ответы

Ответ 1

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) приведет меня туда, где мне нужно зайдите теперь, вставив небольшую оболочку script между тем, что материализованных представлений до конца списка, но тогда мне также придется управлять моими зависимостями для элементов, которые я повторно сортирую (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 из восстановления. Спасибо Дэвиду Дж. Джонстону за советы.

Ответ 2

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

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

Ответ 3

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

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

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