2015-04-02 77 views
0

最近,我在調試PostgreSQL 9.2數據庫損壞問題(在Solaris上,但我懷疑它是否重要),並且我發現如果客戶端在事務中間死亡,然後通過執行關閉PostgreSQL,我們可以可靠地重現它pkill postgres(它基本上發送SIGTERM到每個運行的postgres進程)。如果我們做了pkill -QUIT postgres來發送SIGQUIT,那麼數據庫會乾淨地關閉並且不會發生損壞。安全使用SIGTERM殺死postgres進程?

根據PostgreSQL 9.2 docs,我認爲SIGTERM應該是數據庫服務器預期的100%,那爲什麼不這樣關閉呢?它是PostgreSQL中的一個錯誤,還是我可以做一些事情(配置等),這會讓腐敗發生?

+1

(1)這是一個更適合dba.stackexchange.com的問題; (2)什麼是確切版本,9.2。什麼? (3)你在談論什麼是「腐敗」?什麼錯誤,日誌,症狀等? (4)任何非安全選項,如禁用fync或full_page_writes? – MatheusOl 2015-04-04 14:16:44

回答

0

我不認爲sigterm是什麼導致您的問題。再次強烈建議您使用dba.stackexchange進行詢問。

如果客戶端在交易中途死亡,那麼問題是網絡連接掛起?然後當你殺死它時,你會在WAL重播期間遭受腐敗?

這是一個複雜的領域來解決,但這裏有一些地方開始:

  1. 這是怎麼回事conncurrently當這種情況發生?什麼樣的事務提交加載?
  2. WAL日誌通常會多久輪換一次?

這是可能的,你可以運行與PostgreSQL的一種罕見的,不起眼的錯誤(可能是某個地方的分貝,內核和文件系統之間),但如果是這樣,請升級到最新的9.2開始,嘗試再次重現。在PostgreSQL中,術語甚至殺死信號應該是100%安全的,所以如果你看到數據庫損壞,那是不可預料的。