Как надежно определить, удалось ли восстановить pg, когда успех иногда приводит к коду выхода 1?

при работе pg_restore --clean --dbname=my_database backup_file.sql восстановить дамп базы данных в пустую базу данных, восстановить удастся, но с следующее сообщение:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 161; 1259 16549 TABLE example_table root
pg_restore: [archiver (db)] could not execute query: ERROR:  table "example_table" does not exist
    Command was: DROP TABLE public.example_table;

WARNING: errors ignored on restore: 1

как указано в сообщении, восстановление выполнено успешно. Были ошибки, но pg_restore утверждает, что их проигнорировали. Я также смог вручную запросить базу данных, чтобы убедиться, что все данные, которые я ожидал найти в дампе, присутствовали в базе данных после восстановления.

проблема в команде выше выход с статус 1, а не 0. При выполнении восстановления базы данных программно (как я намереваюсь сделать, когда я автоматизирую этот процесс) это проблематично, так как мой скрипт должен иметь возможность надежно определить, удалось ли восстановление или нет.

есть ли способ сделать pg_restore игнорировать предупреждения при определении статуса выхода? Или есть какой-то альтернативный метод pg_restore Я могу использовать, что я могу получить более точную информацию об успехе/неудаче? Как восстановить базу данных и надежно определить программно, удалось ли восстановить?

обратите внимание, что в настоящее время я использую PostgreSQL 9.1.

1 ответов


оказывается, Postgres на самом деле не знает, что ошибка, упомянутая в вопросе, относительно безвредна; это не то, почему ошибка игнорируется. Причина pg_restore фактически игнорирует эту ошибку, потому что pg_restore по умолчанию настроен на игнорирование почти все ошибки, возникающие в процессе восстановления. Если вы заботитесь о состоянии успеха/сбоя восстановления, это, вероятно, не то поведение, которое вы хотите. Бег!--0--> с --exit-on-error или --single-transaction опции исправьте это, но также заставит Postgres рассматривать ошибку в вопросе выше как полномасштабную фатальную ошибку, а не просто предупреждение (потому что опять же, он на самом деле не знает, что это нормально для этой конкретной команды).

лучшее решение для этого - предпринять шаги, чтобы предотвратить ошибку в первую очередь. В этом случае вы, вероятно, сделаете это с помощью удаление таблиц С отдельной командой перед запуском pg_restore, и выезжая с --clean выбор.