43232
PostgreSQLを使っているのですが、まれにインデックスが破損したと見られる現象が発生します。  
一部のデータ、というか、一部のキー値を指定した場合のみデータの読み込みに失敗（ブロックのデータが読み込めなかった、という旨のエラー）したり、WHERE句で指定していないデータが返ってきたりすることがあります。  
いずれも、REINDEXで直りました。

しかし、REINDEXで直るとは言っても、特に後者のようなケース（エラーではなく、誤った結果を得るケース）は非常に危険ですので、再発防止策を考えなければなりません。  
そもそもなぜインデックスが破損するのでしょうか？

例えば、トランザクションの実行中にアプリケーションが停止し、コミットもロールバックもされなかったとして、データとインデックスが中途半端なことになる、そんなことは起きますか？  
つまり、DB側ではなく、それを利用するアプリケーション側の問題が原因となる可能性はあるのでしょうか？
CC BY-SA 3.0
2018-04-06T00:03:41.920
42969
2018-04-14T04:02:10.413
8078
question
postgresql
PostgreSQLでインデックスが破損する原因
アプリケーション側が原因となる可能性は低く、原因として一番考えられるのはストレージだと思います。
CC BY-SA 3.0
2018-04-07T02:04:42.137
43022
2018-04-07T02:04:42.137
28053
42969
answer
通常の運用状態でインデックスが壊れるとしたら、運悪くレアなバグを踏み抜いた場合です。まず考えられません。

>
> 例えば、トランザクションの実行中にアプリケーションが停止し、コミットもロールバックもされなかったとして、データとインデックスが中途半端なことになる、そんなことは起きますか？  
>  つまり、DB側ではなく、それを利用するアプリケーション側の問題が原因となる可能性はあるのでしょうか？

アプリケーションがクラッシュしたらトランザクションはロールバックされます。

また、PostgreSQLやOSが意図せず停止した場合でも、そうそうデータの破損は起きません。

ただし、PostgreSQLをデータの永続的な保存が保証されない設定(代表的な設定は`fsync=off`)にしていた場合、OSがクラッシュするとデータの不整合が発生します。fsyncに嘘をつくようなOSまたはハードウェアの場合も同様です。

OSのクラッシュなどが発生していないのであれば、おそらくハードウェアの故障によりデータが破損しているかまたは破損しているように見えているということが考えられます。
CC BY-SA 3.0
2018-04-14T04:02:10.413
43232
2018-04-14T04:02:10.413
5793
42969
answer