2014-01-15 57 views
3

我有一張表,我有一個無法通過id找到的行。如果我繞PK索引行,找到該行。如果我刪除索引,則找到該行。如果我添加一個新的索引,找不到行。如何重建損壞的postgres主鍵索引

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

有什麼建議?

+1

這看起來很奇怪。您應該將其發佈到Postgres郵件列表。 –

+0

看起來好像索引一旦創建就被破壞。這個'id'列的類型是什麼,你的postgres安裝中是否有自定義代碼? –

+0

請爲表'widgets'顯示'd +',並且爲-index和without-index計劃顯示'explain'。 'id'是一個'integer' /'bigint'嗎?或者是其他東西?什麼是確切的'SELECT版本()'?你可以發佈一個自包含的數據庫轉儲來演示這個問題。 –

回答

2

我和我的數據庫有類似的問題。我嘗試了REINDEX,但沒有幫助。

VACUUM FULL widgets; 

雖然完全解決了這個問題。

0

循環回本:

我Heroku的支持工作(這是Heroku的Postgres的託管),他們告訴我,在9.3.2中的錯誤,當跟隨被提拔,可能會導致這種腐敗。 (我經歷了幾代提升的粉絲。)

他們說這個問題在9.3.4中得到解決,我最終能夠從備份中重新創建破損的行,刪除行然後重建。

到目前爲止沒有再次發生。