【问题标题】:Dump fails to re-create index over array of hstore column转储无法在 hstore 列的数组上重新创建索引
【发布时间】:2018-05-03 14:44:21
【问题描述】:

我正在使用pg_dump -O -U <user> <db> >dump.sql 转储一个大型数据库。

Here is the gist of dump.sql 剥离了所有不相关的内容。

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

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 有关。但是,我没有简单的方法来测试旧版本的转储,因为它不向下兼容。

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

【问题讨论】:

    标签: postgresql pg-dump postgresql-10


    【解决方案1】:

    这是因为在 PostgreSQL 的最新版本中对 public 架构进行了安全修复。

    要么更改函数,使其引用类型 hstore 及其架构:public.hstore,要么将 SET search_path = public 添加到 CREATE FUNCTION 语句中。

    要对hstore 运算符-> 进行架构限定,您可以替换

    element -> key
    

    与

    element OPERATOR(public.->) key
    

    其他运营商也是如此。

    【讨论】:

    • 非常感谢这个提示!我已将element hstore 更改为element public.hstore,但是,创建索引失败,ERROR: operator does not exist: public.hstore -> character varying 和LINE 1: SELECT concat(string, ' ', element->key)。看来,我在这里仍然缺少一些东西。
    • 当您在此处发布解决方案时我自己想通了,再次感谢!
    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2016-02-04
    相关资源
    最近更新 更多