当然,当我说没有原因时,我的意思是“显然”没有原因,因为服务器上没有发生任何事情(强制关机、数据损坏、死锁等...)。
我问这个是因为,有一个应用程序在 PostgreSQL 上执行了一个简单的选择:
select * from product where barcode = '9990000088355'
什么都没有返回,但表中有一条记录barcode = 9990000088355
。有一个专门针对这个字段的索引,重新索引后,问题解决了,查询获取了记录。
那么,这个问题是否有发生的原因,我可以做些什么来防止这种情况发生,或者至少看看另一个表的其他索引是否有问题?
最后,经过这么多时间我找到了这个问题的原因。我实际上看到运行 postgres 的机器遭受硬重置,之后,发生了确切的错误。
原来我使用的索引是 HASH 索引而不是默认的 B-Tree。因此,在查看 postgres 文档时,我首先看到的是一个巨大的黄色警告,明确说明发生崩溃时它是不安全的。摘自文档:
我所做的只是删除散列索引并使用 B 树算法创建一个新索引。到目前为止,它似乎是可行的解决方案。