Как надежно определить, удалось ли восстановить 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
выбор.