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