昨天在使用 pgadmin III 連上資料庫後, 查詢了幾筆資料後, 突然發現... 似乎有個不平常的訊息出現:
WARNING: database "xxx" must be vacuumed within 107009986 transactions
HINT: To avoid a database shutdown, execute a full-database VACUUM in "xxx".
看起來似乎很嚴重的樣子, 用 google 查了一下, 發現了這篇 postgresql 的文件, 說明是因為沒有做 vacuum 的關係. 只要做一次 vacuum 就可以了.問題是.... 我們的伺服器上頭有打開 auto vacuum 的設定, 也有每天用一個 cron job 去跑 vacuumdb, 怎麼還會有這個問題呢?
更嚴重的是.... 當我試著用 psql 連上去, 跑了 vacuum (資料不少, 跑一次要好幾個小時) 之後, 發現仍然是一樣的結果.... 就連 vacuum full 與 vacuum freeze (又是好幾個小時過去了) 都試過了, 仍然得到同樣的錯誤... 而且那數字也愈來愈小, 據文件所說, 等小於 1 百萬時就會強迫 shutdown, 只能用 single user 去跑了.
google 上頭找了找, 終於看到有人是類似的情形, 不過... 大家在上頭的建議一樣是去執行 vacuum, 而看起來苦主做了之後的結果跟我一樣, 並沒有解決問題. 陸續看了幾個案例, 好像沒有人成功的樣子.... 這... 是 bug 嗎?
今天在該數字逼近百萬之前, 決定把該資料庫用 pg_dump 做一份備份 (其實每天都有整個資料庫的備份, 也是可以用), 然後就直接把該資料庫 drop 再重建一個, 然後再把 dump 下來的資料給 restore 回去... 結果... 果然沒問題.... 只是換成另一個資料庫有問題. 就同樣的方式再處理一次..... 目前看起來應該是沒問題了.
不過... 這個問題也讓我開始懷疑 postgresql 真的適合拿來用嗎? 怎麼會有這樣的問題呢? 如果沒有好的解決方法, 難道過個幾年我們會再碰到相同的問題呢?
如果有人也碰到這個問題, 也有除了 dump/restore 之外的解決方法, 麻煩告知一聲吧.
前輩您用的PostgreSQL是幾版的啊? 在哪個平台上(Windows or ...)?
出問題的是在 linux 上頭用 8.2.3 的版本.









