提幾個我很常講的問題點,其它的都好解。

作者是餓了麼高級 DBA,他舉了幾個 PostgreSQL 的坑。

1. 表膨脹

作者洋洋灑灑寫了一堆 autovacuum_* 的參數,這些控制參數不難知道,難的是這些數字需要依賴情境、硬體環境及數據量調整。功能未夠班者,很難調到好。

2. 表膨脹原因:長事務

長事務是所有資料庫面臨的痛,但 PostgreSQL 的副作用更痛,就是會造成表膨脹。

當表膨脹到無法忍受時,該怎麼做?執行 VACUUM FULL,然後表會有排他鎖問題。

3. 表膨脹原因:事條迴繞

作者把原因說得很清楚了,我之前的簡報也有提過幾次。Heroku 之前踩這個雷,還特別寫了一篇文章要大家注意。

此情況更難知道,因為若沒特別去查,我們幾乎不會知道表的事務號達到需要強制標記所有行為 「凍結」的情況。

接著作者說了更苦的事:在數據量大,事務小的系統,PostgreSQL 為了防止事務迴繞而把 autovacuum 進程佔用也不足為奇了。更慘的是,調大 autovacuum_max_workers 也沒用。結果最後還是必須在凌晨對表人工手動執行 VACUUM FULL 維護。