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 frontend) або маніпулювання текстовим редактором, і трохи менш портативні до інших версій і навіть інших баз даних. Для резервного копіювання я б дотримувався звичайного формату за замовчуванням. Для інших сценаріїв опція бінарного + pg_restore може бути однаковою чи більшою мірою.

Справа в тому, що в Postgresql, у типовому сценарії , резервне копіювання, як правило, виконується за допомогою pg_dump (звичайний) та відновлення зі стандартним клієнтським командним рядком ( 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

Працює як шарм


Це врятувало мене спасибі! Слід прийняти відповідь як мінімум для Windows.
Даніель Батлер

2

Ви можете зробити щось із SOURCEкоманди MySQL :

psql dbname

Потім у postgresql терміналі:

\i filename

2

котячий смітникFileName | psql -h ip -d dbName -U userName -W


1
Зазвичай корисно, якщо ви поясните, що це робить, і чому це може допомогти.
Falcon Momot

1

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

В одному випадку я встановив файл резервного копіювання в контейнер Docker і спробував відновити, але це не вдалося does not appear to be a valid archive. Насправді файл був порожнім, оскільки кріплення виконано неправильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.