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

66

Я использовал 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

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

gruszczy
источник
Попробуйте импортировать дамп на тот же компьютер, на котором он был создан. Также проверьте версии Postgres.
Хэнк Гей
Я не могу попробовать импортировать его на той же машине, потому что это производственная машина. Есть идеи, что еще я могу сделать?
gruszczy
Это решение также может быть актуально для некоторых людей: stackoverflow.com/questions/42433414/…
Мухаммед Ханнан,

Ответы:

93

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

cat db.txt | psql dbname

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

Питер Тиллеманс
источник
5
или psql dbname < db.txt;)
Алексей Дерягин
26

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 ).

leonbloy
источник
2
[OT] Я позволю себе не согласиться с состоянием «не рекомендуется» пользовательского формата вывода - предложение «Это наиболее гибкий формат, поскольку он позволяет изменить порядок загрузки данных, а также определений объектов ...» из руководства. для меня, как довольно одобрение.
Милен А. Радев
«не рекомендуется» было преувеличением, я согласен. Но «самый гибкий» не обязательно означает «самый рекомендуемый». Уточнено.
leonbloy
13

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

psmears
источник
Хотел бы кто-нибудь объяснить это почему? Принятый ответ объясняет, что это будет работать :-)
@skrafi: Какова твоя точка зрения?
psmears
1
извините, вставленный копией неправильный вывод, правильный, pg_restore: [archiver] did not find magic string in file headerтак что это не работает для простого дампа sql
skrafi
@skrafi: я не уверен, что ты имеешь в виду. Если вы используете pg_dump --format=c ...> archivefile, а затем использовать pg_restoreна archivefile, то (по крайней мере , когда я тестировал только сейчас) он работает отлично. Может быть, ваш файл как-то поврежден? Или вы попали в конкретную ошибку?
psmears
6

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

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

pg_dump --format=c olddb_name > db_dump_file.dump

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

pg_restore -v -d newdb_name db_dump_file.dump

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

Технарь
источник
5

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

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

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


источник
Это спасло меня, спасибо! Должен быть принят ответ как минимум за окна.
Даниэль Батлер
2

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

psql dbname

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

\i filename
greg0ire
источник
2

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

Mayank Raipure
источник
1
Обычно полезно, если вы объясните, что это делает и почему это может помочь.
Сокол Момот
1

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

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

Даг Хёйдал
источник