Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何重建损坏的postgres主键索引_Postgresql - Fatal编程技术网

Postgresql 如何重建损坏的postgres主键索引

Postgresql 如何重建损坏的postgres主键索引,postgresql,Postgresql,我有一个表,其中有一行无法通过id找到。如果我绕过PK索引,就会找到该行。如果我删除索引,就会找到该行。如果添加新索引,则找不到行 d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301; id | created_at ---------+---------------------------- 1155301 | 2014-01-10 02:59:47.

我有一个表,其中有一行无法通过id找到。如果我绕过PK索引,就会找到该行。如果我删除索引,就会找到该行。如果添加新索引,则找不到行

d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
   id    |         created_at         
---------+----------------------------
 1155301 | 2014-01-10 02:59:47.856214
(1 row)

d5toqvrtbm8bbu=> CREATE UNIQUE INDEX widgets_pkey ON widgets(id);
CREATE INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
 id | created_at 
----+------------
(0 rows)

d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id - 1 + 1 = 1155301;
   id    |         created_at         
---------+----------------------------
 1155301 | 2014-01-10 02:59:47.856214
(1 row)

d5toqvrtbm8bbu=> DROP INDEX widgets_pkey;
DROP INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
   id    |         created_at         
---------+----------------------------
 1155301 | 2014-01-10 02:59:47.856214
(1 row)

d5toqvrtbm8bbu=> CREATE UNIQUE INDEX widgets_pkey ON widgets(id);
CREATE INDEX
d5toqvrtbm8bbu=> SELECT id, created_at FROM widgets WHERE id = 1155301;
 id | created_at 
----+------------
(0 rows)
这是在postgres 9.3上


有什么建议吗?

我的数据库也有类似的问题。我试过REINDEX,但没用

VACUUM FULL widgets;
但已完全修复此问题。

在此循环:

我与Heroku支持部门合作(这是Heroku Postgres托管的),他们告诉我9.3.2中有一个漏洞,当追随者被提升时,可能会导致这种腐败。(我在几代被提拔的追随者身上感受到了这一点。)

他们说这个问题在9.3.4中得到了解决,我最终能够从备份中重新创建断开的行,删除这些行,然后重建


到目前为止没有再发生。

这看起来很奇怪。你应该把它发布到Postgres邮件列表中。看起来索引一创建就被破坏了。此
id
列的类型是什么?您的postgres安装中是否有任何自定义代码?请显示表
小部件的
\d+
,以及有索引和无索引计划的
说明。
id
是一个
integer
/
bigint
?还是别的什么?确切的
选择版本()
是什么?你能发布一个自包含的数据库转储来演示这个问题吗?转储和恢复修复了这个问题,这与我的结论一致,即我有一个损坏的索引。我自己现在也看到了几乎完全相同的问题。我尝试了REINDEX,它似乎就是为了这个,但它没有帮助。(我想这与创建索引的方式类似,但它立即损坏。)这是在版本为3.3.3的Amazon RDS上。