Синтаксическая ошибка рядом с "=>" при запуске pg_upgrade 9.4 до 9.5

Я не могу обновить свой сервер postgresql с 9.4 до 9.5 из-за следующего сообщения об ошибке:

pg_restore: creating OPERATOR "public.->"
pg_restore: creating OPERATOR "public.<@"
pg_restore: creating OPERATOR "public.=>"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1617; 2617 17937 OPERATOR => william
pg_restore: [archiver (db)] could not execute query: ERROR:  syntax error at or near "=>"
LINE 1: CREATE OPERATOR => (
                        ^
    Command was: CREATE OPERATOR => (
    PROCEDURE = "tconvert",
    LEFTARG = "text",
    RIGHTARG = "text"
);

Я не смог найти что-нибудь подходящее, прибегая к помощи. Наиболее релевантная вещь, которую я могу найти, - это кто-то, кто сталкивался с этой проблемой в гораздо более старой версии hstore, и исправление не ясно.

Я использую доморощенный на Mac. Я бы обошел проблему с pg_dumpall, но я больше не могу его запускать, потому что бинарные файлы 9.4 загружают библиотеки для 9.5 после обновления. Это можно обойти?

3 ответа

Решение

Другие решения либо не были вариантами, либо не работали.
Решение, которое работало для меня, было:

ALTER EXTENSION hstore UPDATE TO '1.1';

Источник: https://www.postgresql.org/message-id/22170.1457479307%40sss.pgh.pa.us

Это ожидается, см. Примечания к выпуску PostgreSQL 9.5:

  • Разрешать => указать именованные параметры в вызовах функций (Pavel Stehule)

    Только ранее := может быть использован. Это требует устранения возможности для => быть пользовательским оператором. Создание пользовательского => операторы выдавали предупреждения начиная с PostgreSQL 9.0.

Вам придется использовать другое имя для оператора. Не существует обходного пути, кроме как взломать PostgreSQL.

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

CREATE EXTENSION hstore FROM unpackaged;

Что бы избавиться от => оператор, который давно устарел. Вам придется изменить весь код приложения, который на него опирается.

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

cd /usr/local/lib
rm postgresql
ln -sv ../../Cellar/postgresql/9.4.5_2/lib/postgresql .
/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_ctl -D /usr/local/var/postgres -l logfile start # start old cluster
/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_dumpall > backup.sql
/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_ctl -D /usr/local/var/postgres -l logfile stop # stop old cluster
rm postgresql
ln -sv ../../Cellar/postgresql/9.5.3/lib/postgresql .

Остальную часть процесса обновления я беру с https://kkob.us/2016/01/09/homebrew-and-postgresql-9-5/

Загрузка данных просто psql < backup.sql На этот раз ошибок нет!

Другие вопросы по тегам