无法恢复,因为索引损坏(附处理损坏索引的一些线索)

这个案例中也有两条记录,其中’shiny-server’只匹配了一条,而’%hiney-server’却匹配了两条。我不太明白这如何帮助我理解,但我想你的意思是,我使用的select语句期望只返回一个结果,并从索引中提取它,而忽略其他结果;但当我使用%时,它会在字段中进行搜索。

discourse=> EXPLAIN ANALYZE select * from tags where name='shiny-server'; 
                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Index Scan using index_tags_on_name on tags  (cost=0.28..8.29 rows=1 width=36) (actual time=0.038..0.040 rows=1 loops=1)
   Index Cond: ((name)::text = 'shiny-server'::text)
 Planning time: 0.129 ms
 Execution time: 0.070 ms
(4 rows)

我怀疑,那些无法自行找出问题的人可能觉得这没什么用,不过……我确实尝试了找出两个具有相同名称的tag_id,并执行类似以下操作:

 TopicTag.where(tag_id: 717).update_all(tag_id: 611)
 Tag.ensure_consistency!
 Tag.find(717) # 确保它不再属于任何主题
 Tag.find(717).destroy

然后在 psql 中执行reindex table tags;

现在看起来,我还需要对users表进行类似操作,正如@bartv 所描述的那样。不过在我的用户中,我看到了一个名为 David 的用户和一个名为 david 的用户,还有[Mm]ark

我是这样修复这些问题的:

marks=User.where("username similar to  '[Mm]+ark'").pluck(:id,:username,:created_at)

然后在/admin/users中找到新的 Mark 用户并在那里重命名该用户。接着在 psql 中尝试执行reindex table users;(先执行sudo su - discourse,再执行psql)。

4 个赞