PostgreSQL. Ошибка pg_restore: [архиватор] неподдерживаемая версия в заголовке файла

by wa   13.12.2014    34467 просмотров

Случилась некая оказия при восстановлении бинарного дампа PostgreSQL.

$ pg_restore db.dump > db.sql  
pg_restore: [архиватор] неподдерживаемая версия (1.12) в заголовке файла

Что же делать? Получилось так... Надо ковырять файл.

$ head db.dump  
PGDMP  
db9.0.139.0.13��     0ENCODINENCODINGSET client_encoding = 'UTF8';

О, кажется версия PostgreSQL 9.0.13. Ищем в репозитории такую версию для своей ОС (в моём случае CentOS 6 x86_x64):

ftp://ftp.postgresql.org/pub/repos/yum/9.0/redhat/rhel-6-x86_64/postgresql90-9.0.13-1PGDG.rhel6.x86_64.rpm

Скачиваем, разархивируем rpm пакет.

$ rpm2cpio postgresql90-9.0.13-1PGDG.rhel6.x86_64.rpm | cpio -idmv

$ ls -la  
итого 952  
drwxr-xr-x 3 root root   4096 Дек 13 12:10 .  
drwxrwxrwt 6 root root   4096 Дек 13 12:05 ..  
-rw-r--r-- 1 root root 962040 Дек 13 11:49 postgresql90-9.0.13-1PGDG.rhel6.x86_64.rpm  
drwxr-xr-x 4 root root   4096 Дек 13 12:10 usr

Нас интересует утилита pg_restore:

$ ls -la usr/pgsql-9.0/bin/pg_restore  
-rwxr-xr-x 1 root root 118312 Апр  2  2013 usr/pgsql-9.0/bin/pg_restore

Ищем нашу рабочую версию pg_restore:

$ whereis pg_restore  
pg_restore: /usr/bin/pg_restore

Переименовываем файл:

$ mv /usr/bin/pg_restore /usr/bin/pg_restore.back

Меняем на нашу версию утилиты:

$ cp usr/pgsql-9.0/bin/pg_restore /usr/bin/pg_restore

Конвертируем бинарный дамп в SQL-файл:

pg_restore db.dump > db.sql

Удаляем ненужную версию pg_restore и восстанавливаем оригинальный файл.

Послесловие. Данный способ не претендует на правильность исполнения, ничего не мешает поставить необходимую версию PostgreSQL. Вполне возможны ошибки синтаксиса SQL, т.к. между разными версиями добавляются новые фичи и возможности.

ADDED

У PostgreSQL есть замечательная wiki с полной информацией по установке разных версий вплоть до ссылок на репозиторий.