运行 pg_upgrade 9.4 到 9.5 时“=>”附近的语法错误

Syntax error near "=>" when running pg_upgrade 9.4 to 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 的库。有解决办法吗?

这是预期的,请参阅 release notes for PostgreSQL 9.5:

  • Allow => to specify named parameters in function calls (Pavel Stehule)

    Previously only := could be used. This requires removing the possibility for => to be a user-defined operator. Creation of user-defined => operators has been issuing warnings since PostgreSQL 9.0.

您必须为接线员使用不同的名称。没有破解 PostgreSQL 的解决方法。

您的问题可能是 hstore contrib 模块的旧安装从未迁移到扩展。在这种情况下,您可以尝试在 旧数据库 之前 像这样导出之前升级它:

CREATE EXTENSION hstore FROM unpackaged;

这将摆脱长期弃用的 => 运算符。您必须更改所有依赖它的应用程序代码。

不是一个完整的解决方案,但最后我恢复到以前的版本并使用 pg_dumpall 备份我的数据库并在新版本中重新加载它们,完全忘记了继承已失效的操作符。在自制软件中,这就像更改符号链接一样简单:

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 这次没有 hstore 错误!

其他解决方案要么不是选项,要么不起作用。
对我有用的解决方案是:

ALTER EXTENSION hstore UPDATE TO '1.1';

来源:https://www.postgresql.org/message-id/22170.1457479307%40sss.pgh.pa.us