pg_restore: [архиватор] неподдерживаемая версия (1.14) в заголовке файла

У меня есть живой сервер и окно разработки, назовите их live и dev соответственно, оба работают с postgresql. Я могу видеть и то, и другое без проблем с помощью pgadmin4, и оба они полностью функциональны: один за действующим веб-сайтом, а другой, когда я запускаю веб-сайт в режиме отладки в моем окне разработчика. Довольно обычная установка.

В течение многих лет я запускал один и тот же сценарий bash, который я написал, который выгружает живую базу данных, а затем восстанавливает ее в окне разработчика, поэтому у меня есть последний живой снимок для работы.

Сегодня это меня не подводит с заголовком:

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

Я пытался диагностировать это, и много искал в Интернете, но сбился с толку и потерпел неудачу, поэтому здесь я готов поделиться своим опытом.

В помощь я поделюсь следующим:

$ pg_dump --version
pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
$ pg_restore --version
pg_restore (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
$ pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test.backup
$ ls -l test.backup 
-rw-r--r-- 1 bernd bernd 2398358 Dec 23 23:40 test.backup
$ file test.backup 
test.backup: PostgreSQL custom database dump - v1.14-0
$ pg_restore --dbname=mydb test.backup 
pg_restore: [archiver] unsupported version (1.14) in file header

Данные pg_dump и pg_restore являются идентичными версиями и:

$ which pg_dump
/usr/bin/pg_dump
$ which pg_restore
/usr/bin/pg_restore
$ ls -l /usr/bin/pg_dump /usr/bin/pg_restore
lrwxrwxrwx 1 root root 37 Nov 14 23:23 /usr/bin/pg_dump -> ../share/postgresql-common/pg_wrapper
lrwxrwxrwx 1 root root 37 Nov 14 23:23 /usr/bin/pg_restore -> ../share/postgresql-common/pg_wrapper

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

Так что я в полном недоумении. Думая, что на живой машине может быть проблема с версией:

$ ssh live.lan
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
$ which pg_dump
/usr/bin/pg_dump
$ which pg_restore
/usr/bin/pg_restore
$ pg_dump --version
pg_dump (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)
$ pg_restore --version
pg_restore (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)

Я вижу, что в live-боксе есть немного более старая версия pg_dump (что имело бы значение только в том случае, если pg_dump в моем dev-боксе каким-то образом использовал RPC для live-бокса для запуска своего pg_dump).

Теперь, возможно, есть небольшая подсказка в том, что мой блок разработчика видел несколько обновлений postgresql, например:

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

Кластеры 11 и 12 остаются неиспользованными, о чем свидетельствуют пустые файлы журнала. Я использую 10. Но я заметил, что:

$ psql --version
psql (PostgreSQL) 12.1 (Ubuntu 12.1-1.pgdg18.04+1)
$ ssh live.lan
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
$ psql --version
psql (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)

что слегка подозрительно, но, опять же, не является очевидной причиной или связью:

  1. Я использую pg_dump, а не psql
  2. Я использую только инструменты pg dev box, а не live box (они не должны иметь значения, теоретически вся передача данных через порт 5432 на live box, который доставляет дамп базы данных в pg_dump на моем dev box).

Вот кластеры на коробке любви, и это порт 5432, который на live.lan я запускаю pg_dump!

$ pg_lsclusters 
Ver Cluster Port Status Owner    Data directory           Log file
10  main    5432 online postgres /data/postgresql/10/main /var/log/postgresql/postgresql-10-main.log

Я сейчас глубоко озадачен и расстроен этим. Был бы глубоко признателен за продвижение подсказок. Если мне придется порыться в темноте, я, вероятно, снова деинсталлирую postgres 11 и 12 и посмотрю, поможет ли это, иначе мне придется отслеживать /usr/share/postgresql-common/pg_wrapper, чтобы увидеть, как и где два пути pg_dump и pg_restore расходятся по несовместимой версии пути.

Обновление:

Еще одна подсказка, которую я обнаружил, которая позволяет мне обходной путь, но просто углубляет загадку, заключается в следующем:

$ sudo -u postgres pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test.backup
$ sudo -u postgres /usr/lib/postgresql/10/bin/pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test2.backup
$ sudo -u postgres pg_restore -l test.backup
pg_restore: [archiver] unsupported version (1.14) in file header
$ sudo -u postgres pg_restore -l test2.backup
... produces listing of contents ...
$ sudo -u postgres pg_dump --version
pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
$ sudo -u postgres /usr/lib/postgresql/10/bin/pg_dump --version
pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)

Это невероятное недоумение. Единственно возможные объяснения:

  1. несмотря на то, что в отчетах указаны идентичные номера версий, два pg_dump различны. Я бы исключил это как невероятное.
  2. pg_dump запускает pg_wrapper, который запускает / usr / lib / postgresql / 10 / bin / pg_dump с некоторыми загадочными аргументами, которые его нарушают!

Второй вариант вероятен и потребует от меня инструмента pg_wrapper для диагностики.

Обновление 2:

И еще один инструментарий pg_wrapper позже. В конце концов, pg_dump запускает pg_wrapper, который запускает /usr/lib/postgresql/12/bin/pg_dump, но работает /usr/lib/postgresql/10/bin/pg_restore ... Вперед! Начинаю думать, что это ошибка совместимости версий postgresql!

Обновление 3:

Заглянув глубже в pg_wrapper, выяснил причину, и да, я бы сказал, что это своего рода ошибка pg_wrapper, хотя она может быть спорной, хотя ИМХО вряд ли. Вот что он делает:

Если указан --host, то он использует самую последнюю установленную версию postgresql (в моем случае 12, и это для pg_dump, поэтому pg_dump 12 создает дамп)

Если --host не указан, он обращается к конфигурации пользователя (в моем случае 10, и это для pg_restore, поэтому pg_restore 10 запущен и не может прочитать файл, созданный pg_dump 12).

Так почему это ошибка? Потому что у меня есть конфигурация использования, и я бы хотел, чтобы она уважалась независимо от того, разговариваю ли я с удаленным хостом. Более того, если я укажу хост, я определенно не ожидаю, что буду использовать последнюю локальную версию, игнорируя локальную конфигурацию. Я ожидаю, что либо будет соблюдаться локальная конфигурация (как в случае, когда удаленный хост не указан), либо попытаться сопоставить версию хостов rmeote. Произвольная опора на последнюю установленную версию ИМХО глубоко сомнительна.

НО оказывается, что есть обходной путь, который работает. По сути вместо:

sudo -u postgres pg_restore -l test.backup

это работает:

sudo -u postgres pg_restore --host=localhost -l test.backup

По иронии судьбы указав хост, мы заставляем его игнорировать локальные конфигурации и использовать новейшую версию pg_restore, которая, похоже, отлично работает при восстановлении в кластере PG 10.


person Bernd Wechner    schedule 23.12.2019    source источник
comment
Начинаю думать, что это ошибка совместимости версий postgresql! Похоже на ошибку упаковки.   -  person jjanes    schedule 23.12.2019
comment
@BerndWechner Я использовал следующую команду: sudo -u postgres pg_restore --verbose --clean --jobs=4 --disable-triggers --no-acl --no-owner -h localhost -U postgresql -d everest_development dump.psql, но это не сработало. Я также получаю ту же ошибку при импорте одной базы данных.   -  person LearningROR    schedule 24.12.2019
comment
Также, если я сделаю: muhammad@muhammad-mohsin:~/workspace_ror/everest$ psql -d everest_development -f dump.psql The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.   -  person LearningROR    schedule 24.12.2019
comment
Подтверждаю ваш вывод. pg_dump использует исполняемый файл последней версии (v12), если хост явно указан. Это похоже на ошибку или недоработку.   -  person oᴉɹǝɥɔ    schedule 10.01.2020
comment
Каково решение? Я пробовал все эти сценарии   -  person don pentavia    schedule 23.01.2020
comment
Не уверен в решении, но я опубликовал обходной путь. На мой взгляд, разница в том, что это работает, но в этом нет необходимости, pg_wrapper должно быть умнее, чем есть на самом деле. Обходной путь - просто указать --host explicitly при использовании pg_dump и pg_restore, и это заставит их обоих использовать одну и ту же версию postgresql (последнюю версию, установленную в вашей системе) и оставаться совместимыми. Если вы используете --host на одном, а не на другом, и у вас установлено несколько версий postgresql, а более ранняя версия все еще используется в локальных конфигурациях, то возникает проблема, когда вы забываете об этой проблеме.   -  person Bernd Wechner    schedule 23.01.2020
comment
Просто скачайте последнюю версию pg admin, если вы используете windows   -  person silvedo    schedule 18.04.2020


Ответы (5)


ubuntu, ребята: скорее всего ваш pg_restore устарел. Просто используйте postgres doc и установите последнюю версию postgres:

  1. Создайте файл /etc/apt/sources.list.d/pgdg.list и добавьте строку для репозитория: deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main где версии ubuntu:

    • 20.04 - focal
    • 18.04 - бионический
    • 16.04 - ксениал
  2. Добавьте ключи: wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

  3. sudo apt-get update && sudo apt-get upgrade

У меня это сработало!

person asiniy    schedule 11.05.2020

Вот еще один поворот, но сначала обратите внимание, что это корпус для Windows. Если для вас это просто Linux, не читайте дальше. Все советы, приведенные здесь, мне не помогли, в конечном итоге причина IMC была проще и была связана с использованием pgAdmin. Из-за повторяющихся проблем с новыми версиями я обычно устанавливаю pgAdmin отдельно (без использования stackbuilder). (По крайней мере) в этом случае pgAdmin имеет свой собственный кеш служебных программ и будет использовать их, если вы не укажете иное. Мои экземпляры pg все еще версии 11 (.6), но последняя версия pgAdmin, вероятно, будет иметь утилиты V12. Что вполне может вызвать расхождение в версиях. Это подкралось ко мне после нескольких успешных переводов с моей основной машины на ноутбук. Итак, в pgAdmin выполните (меню) Файл-> Настройки-> Пути и установите двоичные пути, соответствующие вашей установке postgres, IMC C: \ Program Files \ PostgreSQL \ 11 \ bin. Это сработало.

person Jan    schedule 26.03.2020

Так что мой опыт здесь был чем-то похож на OP, но не полностью.

У меня были установлены версии 9.4, 9.5, 11 и 12, и все инструменты pg_ * указывали на версию 9.4. Я попытался pg_restore создать дамп версии 12 на другом хосте, что не сработало, потому что этот хост использовал инструменты 9.4, которые были несовместимы (та же ошибка, что и опубликованная OP).

Итак, вот мой процесс отладки:

  • which pg_restore
    • /usr/bin/pg_restore
  • ls -l /usr/bin/pg_restore
    • /usr/bin/pg_restore -> ../share/postgresql-common/pg_wrapper
  • vim /usr/share/postgresql-common/pg_wrapper
    • Read about how it determines version. Just read through the first 20 or so lines

Очевидно, есть опция --cluster, которая помогает определить версию. Я просто добавил --cluster 12/main к своему pg_restore вызову, и все снова заработало, как ожидалось.

person Eldamir    schedule 18.09.2020

проверьте, обновлен ли ваш pgadmin, у меня была эта проблема, и я решил ее, обновив

person Vincent Tang    schedule 24.04.2020

Эта ошибка вызвана несоответствием версии между версией pg_dump, использованной для создания файла резервной копии, и версией pg_restore, использованной для попытки восстановления.

Обновление моего PostgreSQL решило проблему

person Wariored    schedule 04.05.2020
comment
К какой версии? v12 явно имела эту проблему в pg_wrapper. До какой версии вы обновились? Если есть обновление до 12, которое исправляет это, дайте нам знать. - person Bernd Wechner; 06.05.2020
comment
Я обновился до версии 12.2 - person Wariored; 06.05.2020