PostgreSQL , Freeze , 風暴git
PostgreSQL 目前默認的存儲引擎,事務可見性須要依賴行頭的事務號,由於事務號是32位的,會循環使用。github
在一條記錄產生後,若是再次經歷了20億個事務,必須對其進行freeze,不然數據庫會認爲這條記錄是將來事務產生的(可見性判斷)。數據庫
所以FREEZE操做是數據庫在32位事務號的狀況下,常常要作的。post
對全表進行FREEZE操做時,會掃描整表,將大於指定閾值least(autovacuum_freeze_min_age, 表級參數vacuum_freeze_min_age)年齡的記錄設置爲freeze。可能致使大量的讀IO,寫IO(主要是寫數據文件,WAL日誌, full page write WAL)。spa
一些參數決定數據庫在何時觸發FREEZE,以及觸發FREEZE時,凍結哪些記錄,以及是否涉及到調度(sleep)。日誌
同時不少參數有庫級、表級選項。表級優先,而後是庫級,最後是實例級。code
一、多久檢查一次哪些表是否須要FREEZE事務
postgres=# show autovacuum_naptime ; autovacuum_naptime -------------------- 1s (1 row)
二、哪些表須要被自動FREEZE,get
超過以下閾值,若是設置了表級參數則以表級參數爲準,不然以系統參數爲準。
表級參數 autovacuum_freeze_max_age autovacuum_freeze_table_age 系統級參數 autovacuum_freeze_max_age
三、手工執行普通vacuum時,哪些表會被掃描全表,並freeze
超過以下閾值
系統級參數 vacuum_freeze_table_age
注意,如今PG支持VM文件裏面記錄一個PAGE是否須要被FREEZE,因此即便全表掃描,也會根據VM標記位,跳過一些BLOCK,因此FREEZE並不必定會產生大量讀IO。根據表的狀況而定。
三、觸發FREEZE時,哪些記錄須要被FREEZE
超過以下閾值的記錄被FREEZE,若是設置了表級參數則以表級參數爲準,不然以系統參數爲準。