Восстановление PostgreSQL 11 резервной копии до 12 зависаний. Как я могу отладить это? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь обновить экземпляры heroku PostgreSQL с pg11 до pg12, используя метод копирования , так как мои тестовые среды находятся на хобби. В конце процесса он, кажется, висит долго (не завершается через> 30 минут для базы данных объемом 120 МБ). Представление хранилища данных показывает, что все в порядке, у меня такое же количество строк, но есть проблемы.

Кажется, это ошибка материализованного представления. Если я подключусь к базе данных и посмотрю таблицы и представления, только одна из них окажется пустой. Используя postico, он ожидает и ожидает структуру представления, но не выдает обычное предупреждение для незаполненного представления.

Я могу воссоздать поведение сваливания, создав локальную базу данных pg12 и попытка использовать pg_restore с последней резервной копией. Таким же образом я, кажется, смог заставить его работать, создав пустую локальную базу данных, выполнив все миграции db, обрезав все таблицы и последовательности, а затем выполнив загрузку --data-only --disable-triggers из той же резервной копии. Не особенно плавный или вдохновляющий план плана миграции. Использование --verbose не выявляет никаких явных ошибок, последнее, что я получаю, это то, что он создает проблематичное c материализованное представление.

Я также установил log_statement в all, и последнее, что я получаю, это то, что он обновляет проблемное представление c. На этом этапе команда postgres начинает использовать ~ 100% ЦП.

Локально, я использую эту команду для восстановления:

pg_restore --verbose --clean --no-acl --no-owner -h localhost -d database_name database_backup.dump

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

Существуют ли какие-либо известные ошибки с обновлением с 11 до 12 или способы, которыми я мог бы получить больше информации о том, что происходит?

1 Ответ

2 голосов
/ 24 марта 2020

Вероятно, он выбрал ужасный план для выполнения запроса материализованного представления из-за отсутствия статистики во время запуска refre sh.

Вы можете завершить процесс, а затем перезапустить refre sh как только статистика собрана (что может быть уже).

Если начать с нуля, вы можете запустить pg_restore с --section из pre-data и data, затем выполнить АНАЛИЗ, затем выполнить post-data.

...