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

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


Попробуйте импортировать дамп на тот же компьютер, на котором он был создан. Также проверьте версии Postgres.
Хэнк Гей

Я не могу попробовать импортировать его на той же машине, потому что это производственная машина. Есть идеи, что еще я могу сделать?
gruszczy

Это решение также может быть актуально для некоторых людей: stackoverflow.com/questions/42433414/…
Мухаммед Ханнан,

Ответы:



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


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

«не рекомендуется» было преувеличением, я согласен. Но «самый гибкий» не обязательно означает «самый рекомендуемый». Уточнено.
leonbloy

13

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


Хотел бы кто-нибудь объяснить это почему? Принятый ответ объясняет, что это будет работать :-)

@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

2

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


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

1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.