Используйте pg_restore для восстановления из более новой версии PostgreSQL - PullRequest
10 голосов
/ 05 января 2011

У меня есть (рабочий) сервер БД под управлением PostgreSQL v9.0 и компьютер для разработки под управлением PostgreSQL v8.4.Я хотел бы взять дамп производственной БД и использовать его на компьютере разработчика.Я не могу обновить postgres на компьютере разработчика.

На производственном компьютере я запускаю:

pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats

На компьютере разработчика я запускаю:

pg_restore -d nvdlstats -U nvdladmin nvdls.db

И я получил эту ошибку:

pg_restore: [archiver] unsupported version (1.12) in file header

Это происходит независимо от того, выбираю ли я пользовательский формат, tar или plain_text при дампировании.

Я нашел одно обсуждение онлайн что говорит о том, что я должен использовать более новую версию pg_restore на компьютере разработчика.Я попробовал это, просто скопировав бинарный файл 9.0 на машину разработчика, но это не удалось (не случайно) из-за проблем со связыванием.

Я думал, что смысл использования дампа plain_text заключается в том, что он будет сырым, переносимымSQL.Очевидно нет.

Как я могу получить 9.0 БД в мою установку 8.4?

Ответы [ 5 ]

27 голосов
/ 05 января 2011

pg_restore - только для восстановления дампов, взятых в «пользовательском» формате.

Если вы создаете дамп в виде простого текста, вы должны использовать psql для запуска сгенерированного сценария SQL:

psql -f nvdls.db dbname username 
3 голосов
/ 05 января 2011

Использование pg_dump / pg_restore для перехода с 9.0 на 8.4 не поддерживается - поддерживается только движение вперед.

Однако вы обычно можете передавать данные (в дампе только для данных), а в некоторых случаях вы можете получить схему - но в основном это удача, это зависит от того, какие функции вы используете.

Обычно вы должны использовать целевую версию pg_dump и pg_restore - это означает, что в этом случае вы должны использовать двоичные файлы из 8.4. Но вы должны использовать одинаковую версию pg_dump и pg_restore. Оба инструмента будут отлично работать в сети, поэтому нет необходимости копировать двоичные файлы.

И, как говорит a_horse_with_no_name, вам может быть лучше использовать pg_dump в режиме открытого текста - это позволит вам вручную отредактировать дамп при необходимости. В частности, вы можете сделать один дамп только для схемы (с -s) и один дамп только для данных - только дамп схемы, вероятно, потребует какого-либо редактирования.

2 голосов
/ 10 августа 2013

Я решил это, обновив postgresql с 8.X до 9.2.4. Если вы используете brew на Mac OS-X, используйте -

brew upgrade postgresql

Как только это будет сделано, просто убедитесь, что ваша новая установка postgres находится на вершине вашего пути. Это будет выглядеть примерно так (в зависимости от пути установки версии) -

export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH
2 голосов
/ 25 мая 2011

Если база данных 9.0 содержит какие-либо столбцы bytea, то возникают большие проблемы.

Эти столбцы будут экспортированы pg_dump с использованием представления "hex" и появятся в вашем файле дампа как:

SELECT pg_catalog.lowrite (0, '\ x0a2')

Любая версия бэкэнда postgres ниже 9.0 не может получить шестнадцатеричное представление bytea, и я не могу найти опцию, чтобы сказать pg_dump на 9.0сторона не использовать его.Установка по умолчанию для параметра «bytea_output» значения ESCAPE для базы данных или всего сервера, по-видимому, игнорируется pg_dump.

Я полагаю, что было бы возможно пост-обработать файл дампа и фактически изменить каждый байт, закодированный в шестнадцатеричном форматезначение для сбежавшего, но меня не волнует риск неумолимого искажения вещей, которые обычно хранятся в байтах (изображения, PDF-файлы и т. д.).

0 голосов
/ 19 октября 2016

У меня была такая же проблема.Я использовал pgdump и psql для экспорта / импорта БД.

1.Установите PGPASSWORD

export PGPASSWORD='h0ld1tn0w';

2. Экспорт БД с помощью pg_dump

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/ opt / db.вне пути дампа.Вы можете указать свой собственный.

3. Затем снова установите PGPASSWORD вашего другого хоста.Если хост такой же или пароль тот же, то это не требуется.

4. Импортируйте базу данных на ваш другой хост

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out

Если имя пользователя отличается, найдите и замените его на локальное имя пользователя вфайл db.out.И убедитесь, что имя пользователя заменено, а не данные.

...