我有postgresql 9.5.2生產服務器,有一些嚴重的索引問題。最強的證據支持這種說法是有些疑問的不一致:Postgresql索引損壞的原因 - postgresql的錯誤或硬件故障
select count(*) from x inner join y on x.a = y.a
select * from x inner join y on x.a = y.a
的COUNT(*)查詢將返回不同數量比選擇*查詢,剛剛返回的行返回的行數。我嘗試的第一件事是真空分析,但這並沒有解決問題。最後,爲了讓服務器再次運行,刪除所有索引並重建它們,此時select *和select count(*)查詢之間的結果變得一致。
這兩個表都沒有任何觸發器。表x有170萬行,表y有690萬行和600,000行刪除,並且這些表使用外鍵字段a(它是表x中的主鍵)和表b中的非空外鍵約束。數據庫服務器位於虛擬機中。服務器是唯一的節點,並且不會複製到其他服務器。系統從來沒有崩潰,所以雖然我知道崩潰的服務器或postgres服務可能會損壞索引,但我沒有理由相信發生這些事件的原因之一,因爲:a)postgres服務從未不可用; b)服務器指出它有這個問題早在這個問題出現之前就已經存在很長時間了。
所有這些數據都表明問題是索引無法正常工作。我對損壞索引的研究通常指向兩個原因,postgresql中的錯誤或硬件故障。
硬件故障的解決方案和數據庫本身的錯誤是通過完全不同的技術來解決的,即一種涉及採購硬件,另一種涉及編寫程序來檢查索引的完整性,並在必要時採取適當的措施來糾正問題。
我可以收集哪些證據來支持每種理論(硬件故障與軟件錯誤)?
我們使用pg_dump進行備份,備份索引的存在,但我不認爲它會複製索引本身。託管服務器的系統沒有崩潰,據我所知,postgresql服務器也沒有崩潰。 – zelinka