【问题标题】:corrupted pg_class data? ghost index on non-existent table损坏的 pg_class 数据?不存在的表上的幽灵索引
【发布时间】:2015-03-18 22:47:37
【问题描述】:

我在创建/删除索引时遇到了一些问题。 所以最初我有

DROP INDEX IF EXISTS ros_tmp_schoolid_IX;

然后

CREATE INDEX ros_tmp_schoolid_IX on ros.sometable USING btree (somecolumn);

它抱怨索引已经存在

然后我将方法切换为

IF EXISTS (SELECT 1
            FROM   pg_class c
            JOIN   pg_namespace n ON n.oid = c.relnamespace
            WHERE  c.relname = 'ros_tmp_schoolid_IX'
            AND    n.nspname = 'ros')
THEN
    DROP INDEX ros_tmp_schoolid_IX;
END IF;

但我仍然收到索引不存在错误...所以我查看了 pg_class 表,我能够找到该索引的记录。

我也尝试了以下所有方法,但均未奏效:

  1. 丢表;
  2. 重新索引/分析/清理整个数据库
  3. 重新索引表 pg_class

我正在使用带有 Rails(4.1.5) 的 Postgresql 9.3。这在运行我的测试套件时随机发生......在处理大块数据时,我正在使用临时表并在作业完成后删除它们。

我不确定是什么导致了这个问题。还有什么我应该研究的吗?

谢谢!

=========

另外,我在 pg_class 中发现了更多,我想我需要一种方法来清理它。

所以我尝试在不同的表上创建具有相同名称的索引,并且成功。 但是..当我再次尝试删除它时...我得到关系不存在错误。在那之后我尝试运行 CREATE INDEX 查询,然后它说关系已经存在...... postgres无法决定......

【问题讨论】:

  • DROP INDEX IF EXISTS "ros_tmp_schoolid_IX";(以及将来:避免混合大小写标识符;它们是 PITA,恕我直言)
  • 你好 joop,它告诉我跳过,因为索引不存在。我在这里要做的是 1. 清理 pg_class 中的无效记录; 2. 重新创建这个索引。 (重新索引不起作用,因为索引不存在)。感谢您的命名建议。
  • (SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ILIKE 'ros_tmp_schoolid_IX' AND n.nspname = 'ros') 的结果是什么?
  • 它返回 1 :) @joop 也 select * 返回索引的名称和 oid 等。
  • 现在试试SELECT c.relname FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ILIKE 'ros_tmp_schoolid_IX' AND n.nspname = 'ros' ; 并在您的删除索引语句中完全使用该名称用双引号

标签: database postgresql indexing postgresql-9.3


【解决方案1】:

短版:您想要包含架构的名称:

 DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX;

解释

创建索引时,它会自动进入与指定表相同的架构。正如doc 所指出的那样,甚至不允许使用模式名称:

此处不能包含架构名称;索引总是在 与其父表相同的架构

但是,在删除索引时,如果架构不在搜索路径中,则需要指定架构。在您的情况下,大概ros 不在search_path 中。

同样如 cmets 中所述,带有大写字母但未用双引号括起来的索引名称将被转换为小写,因此在 CREATE INDEX ros_tmp_schoolid_IX ... 之后,您会在 pg_class.relname 中找到 ros_tmp_schoolid_ix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多