如何重建腐败的postgres主键索引

时间:2014-01-15 16:52:04

标签: postgresql

我有一张表,我有一行无法找到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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我的数据库遇到了类似的问题。我试过REINDEX,但它没有帮助。

VACUUM FULL widgets;

完全解决了这个问题。

答案 1 :(得分:0)

循环回来:

我使用Heroku支持(这是Heroku Postgres主持),他们告诉我9.3.2中有一个错误,当追随者被提升时可能导致这种腐败。 (我经历了几代晋升的粉丝。)

他们说问题在9.3.4中得到了解决,我最终能够从备份中重新创建已损坏的行,删除行然后重建。

到目前为止没有再次出现。