1

我正在倾销一个大型数据库pg_dump -O -U <user> <db> >dump.sql

这是 dump.sql 的要点,所有无关的东西都被剥离了。

使用 将转储导入另一个 Postgres 实例(相同设置)时,第147 行psql -f dump.sql -U <user> <db>发生以下错误:CREATE INDEX

psql:dumped.sql:147: ERROR:  type "hstore" does not exist
LINE 5:           element hstore;
                          ^
QUERY:
        DECLARE
          arrHstore ALIAS FOR $1;
          key ALIAS FOR $2;
          element hstore;
          string text;
        BEGIN
          FOREACH element IN ARRAY arrHstore LOOP
            string := concat(string, ' ', element->key);
          END LOOP;
          RETURN trim(leading from string, ' ');
        END;

CONTEXT:  compilation of PL/pgSQL function "immutable_array_to_string" near line 5

所以除了决赛之外的一切CREATE INDEX都奏效了。

现在我使用之前失败的命令连接到数据库psql -U <user> <db>并粘贴CREATE INDEX...索引的创建没有任何问题。

我尝试过的几件事:

  • 仅转储结构--schema-only会创建一个可以正常导入的转储。仅当至少插入一行作为转储的一部分时才会出现此问题。
  • 我倾向于排除所有者/权限作为原因,因为我使用-O.
  • 这个特定的索引已有多年历史,直到最近,类似的转储都运行良好。因此,它可能与升级到 Postgres 10.3 有关。但是,我没有简单的方法来测试旧版本的转储,因为它不向下兼容。

知道这里发生了什么吗?提前致谢!

4

1 回答 1

1

public这是因为PostgreSQL 最新版本中有关架构的安全修复。

更改函数以使其引用hstore具有其模式的类型:public.hstore,或添加SET search_path = publicCREATE FUNCTION语句中。

hstore要对operator进行模式限定->,您可以替换

element -> key

element OPERATOR(public.->) key

其他运营商类似。

于 2018-05-03T14:49:18.303 回答