pg_class 数据损坏?幽灵索引不存在 table
corrupted pg_class data? ghost index on non-existent table
我 运行 解决了 creating/dropping 索引的一些问题。
所以本来我有
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 table,我能够找到该索引的记录。
我也尝试了以下所有方法并且 none 有效:
- 删除 table;
- reindex/analyze/vacuum整个数据库
- 重新索引tablepg_class
我在 Rails(4.1.5) 中使用 Postgresql 9.3。当 运行 在我的测试套件中随机发生这种情况......在处理大块数据时,我正在使用临时 tables 并在工作完成后删除它们。
我不确定是什么导致了这个问题。还有什么我应该检查的吗?
谢谢!
=========
另外,我在 pg_class 中发现了更多,我想我需要一种方法来清理它。
所以我尝试在不同的 table 上创建具有相同名称的索引,并且成功了。
但是..当我再次尝试删除它时...我得到了关系不存在的错误。在那之后我尝试 运行 CREATE INDEX 查询,然后它说关系已经存在...postgres 无法决定...
简短版本:您要包含架构的名称:
DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX;
解释:
创建索引时,它会自动进入与指定的 table 相同的模式。甚至不允许使用架构名称,如 doc 所示:
No schema name can be included here; the index is always created in
the same schema as its parent table
但是,删除索引时,如果架构不在搜索路径中,则需要指定架构。大概 ros
在你的情况下不在 search_path
中。
另外如评论中所述,索引名称为大写但未包含在双引号中的索引名称将转换为小写,因此在 CREATE INDEX ros_tmp_schoolid_IX ...
之后,您会在 [= 中找到 ros_tmp_schoolid_ix
15=]
我 运行 解决了 creating/dropping 索引的一些问题。 所以本来我有
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 table,我能够找到该索引的记录。
我也尝试了以下所有方法并且 none 有效:
- 删除 table;
- reindex/analyze/vacuum整个数据库
- 重新索引tablepg_class
我在 Rails(4.1.5) 中使用 Postgresql 9.3。当 运行 在我的测试套件中随机发生这种情况......在处理大块数据时,我正在使用临时 tables 并在工作完成后删除它们。
我不确定是什么导致了这个问题。还有什么我应该检查的吗?
谢谢!
=========
另外,我在 pg_class 中发现了更多,我想我需要一种方法来清理它。
所以我尝试在不同的 table 上创建具有相同名称的索引,并且成功了。 但是..当我再次尝试删除它时...我得到了关系不存在的错误。在那之后我尝试 运行 CREATE INDEX 查询,然后它说关系已经存在...postgres 无法决定...
简短版本:您要包含架构的名称:
DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX;
解释:
创建索引时,它会自动进入与指定的 table 相同的模式。甚至不允许使用架构名称,如 doc 所示:
No schema name can be included here; the index is always created in the same schema as its parent table
但是,删除索引时,如果架构不在搜索路径中,则需要指定架构。大概 ros
在你的情况下不在 search_path
中。
另外如评论中所述,索引名称为大写但未包含在双引号中的索引名称将转换为小写,因此在 CREATE INDEX ros_tmp_schoolid_IX ...
之后,您会在 [= 中找到 ros_tmp_schoolid_ix
15=]