2

由于以下错误消息,我无法将我的 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 的库。有没有解决的办法?

4

3 回答 3

1

这是预期的,请参阅PostgreSQL 9.5 的发行说明

  • 允许=>在函数调用中指定命名参数 (Pavel Stehule)

    以前只能:=用。这需要消除=>成为用户定义运算符的可能性。自 PostgreSQL 9.0 以来,创建用户定义的=>运算符一直在发出警告。

您必须为操作员使用不同的名称。除了破解 PostgreSQL,没有其他解决方法。

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

CREATE EXTENSION hstore FROM unpackaged;

这将摆脱=>已被弃用很长时间的运营商。您必须更改所有依赖它的应用程序代码。

于 2016-08-01T07:27:52.920 回答
1

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

ALTER EXTENSION hstore UPDATE TO '1.1';

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

于 2016-11-02T14:38:37.770 回答
0

不是一个完整的解决方案,但最后我恢复到以前的版本并使用 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 错误!

于 2016-08-01T15:05:43.397 回答