pg_dump и pg_restore: входной файл не является допустимым архивом

Я использовал pg_dump на одной машине и скопировал файл результатов на другую, где я пытался восстановить его. Я считаю, что схема такая же. Тем не менее, я получаю:

pg_restore: [archiver] input file does not appear to be a valid archive

Я сделал следующие операции:

pg_dump -a -f db.txt dbname

а также:

pg_restore -a -d dbname db.txt

Что может быть не так?

10 ответов

Решение

Вы дамп в простом формате sql, который был разработан для подачи в psql. Это не распознается pg_restore.

cat db.txt | psql dbname

должен сделать трюк

pg_dump по умолчанию создает команды sql, необходимые для воссоздания данных. Чтобы восстановить его, вам просто нужно вызвать psql (не pg_restore) с файлом в качестве ввода. pg_restore должен использоваться только для двоичного (не по умолчанию и менее обычного не рекомендуется) формата pg_dump, Прочитайте документы.

Обновление: pg_dump двоичные форматы (-Fc-Ft) которые должны использоваться с pg_restore все в порядке, и предлагают дополнительную гибкость. Но они менее стандартны (не SQL), менее пригодны для импорта из некоторых инструментов (например, из php-интерфейса) или для работы с текстовым редактором, и немного менее переносимы для других версий и даже других баз данных. Для резервных копий я бы использовал стандартный формат по умолчанию. Для других сценариев опция binary + pg_restore может быть одинаково или более подходящей.

Следует учесть, что в Postgresql в типичном сценарии резервное копирование обычно выполняется с помощью pg_dump (plain) и восстановления с помощью стандартного клиента командной строки (psql).

Попробуйте передать --format=c возможность pg_dump, Это позволит pg_restore восстановить его.

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

Резервное копирование вашей базы данных

pg_dump --format=c olddb_name > db_dump_file.dump

Чтобы восстановить эту резервную копию

pg_restore -v -d newdb_name db_dump_file.dump

Узнайте больше о pg_dump и pg_restore

Для пользователей Windows попробуйте

type db.txt | psql --username="YOURNAME" dbname

Работает как шарм

Вы можете сделать что-то с MySQL SOURCE команда:

psql dbname

Затем в терминале postgresql:

\i filename

Кошка dumpFileName | psql -h ip -d имя_бд -U имя_пользователя -W

Это сообщение об ошибке также может означать, что на самом деле что-то не так с файлом резервной копии (или вашими предположениями по этому поводу).

В одном случае я смонтировал файл резервной копии в контейнере Docker и попытался восстановить его, но с ошибкой does not appear to be a valid archive, И на самом деле файл был пуст, потому что монтирование не было выполнено правильно.

Если вы используете Windows, позвоните вpsqlклиент Postgres в оболочке с параметрами, как показано ниже:

      psql -h <your_host_name> -p <postgres_port_number> -U <your_user_name_in_postgres> -f "<your_sql_script>.sql" <your_database_name>

Пример:

      psql -h localhost -p 5432 -U postgres -f "C:\Users\Mx\Downloads\northwind.postgre.sql" northwind

Я получил ту же ошибку ниже:

pg_restore: ошибка: входной файл не является действительным архивом

Потому что я экспортировал, но не заархивировалappleбазу данных с помощью pg_dump , как показано ниже:

      pg_dump -U john apple > backup.sql

Или:

      pg_dump -U john -Fp apple > backup.sql

Затем я попытался импортировать неархивныеbackup.sqlкorangeбаза данных с pg_restore , которую необходимо использовать для импорта файлов архива:

      pg_restore -U john -d orange < backup.sql

Итак, я сделал это с помощью psql , который нужно использовать для импорта неархивных файлов, тогда я смог устранить ошибку. *В моем ответе объясняется, как экспортировать схему и данные, а в моем ответе объясняется, как импортировать схему и данные:

      psql -U john -f backup.sql orange
Другие вопросы по тегам