Синтаксическая ошибка рядом с "=>" при запуске 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
На этот раз ошибок нет!