vacuum是一種維護過(guò)程,有助于PostgreSQL的持久運行,它的兩個(gè)主要任務(wù)是刪除死元組,以及凍結事務(wù)標識。
vacuum的作用: 1.釋放,再利用更新/刪除的行所占據的磁盤(pán)空間。 2.更新postgresql查詢(xún)計劃中使用的統計數據。 3.防止因事務(wù)ID的重置而使非常老的數據丟失。
并發(fā)清理過(guò)程為指定的表或者數據庫中的表執行以下任務(wù):
第一部分 1.從指定的表中依次處理每一張表, 2.獲取表上的ShareUpdateExclusiveLock鎖(該鎖允許其他事物對該表進(jìn)行讀?。?。 3.掃描表中的所有頁(yè)面,獲取所有的死亡元組,(死元組的列表存儲在本地內存的maintenance_work_mem里) 4.如果有必要,凍結舊的元組的事務(wù)標識 5.移除指向死亡元組的索引元組 第二部分 1.移除每一頁(yè)中的死亡元組,并對每一頁(yè)內的的活元組進(jìn)行碎片整理,重排本頁(yè)的活元組 2.更新已經(jīng)處理的空閑空間映射(FSM)和可見(jiàn)性映射(VM) PG會(huì )不斷執行這個(gè)過(guò)程直至最后一頁(yè) 第三部分 1.如果最后一個(gè)頁(yè)面沒(méi)有任何元組,則截斷最后一頁(yè) 2.更新與凍結事務(wù)標識相關(guān)的系統視圖(pg_class與pg_database) 3.釋放ShareUpdateExclusiveLock鎖 第四部分 1.更新一些統計信息(pg_stat_all_tables等) 2.移除不必要的提交日志文件,移除CLOG(10版本及以后為xact)中的非必要文件與頁(yè)面 (當更新pg_database.datfrozenxid時(shí),會(huì )嘗試刪除不必要的CLOG)
清理過(guò)程會(huì )使用共享緩存,處理過(guò)的頁(yè)面不會(huì )緩存在共享緩存里。
為了移除死亡元組,清理過(guò)程有兩種模式,分別是并發(fā)清理與完整清理。清理過(guò)程刪除表文件每個(gè)頁(yè)面中的死元組,而其他事務(wù)可以在其運行時(shí)繼續讀取該表。相反,完整清理不僅會(huì ) 移除整個(gè)文件中所有的死元組,還會(huì )對整個(gè)文件中所有的活元組進(jìn)行碎片整理。其他事務(wù)在完整清理運行時(shí)無(wú)法訪(fǎng)問(wèn)該表。
清理過(guò)程涉及全表掃描,所以引入了可見(jiàn)性映射(Visibility Map,VM)來(lái)提高移除死元組的效率。
VM:每個(gè)表都有各自的可見(jiàn)性映射,用于保存表文件中每個(gè)頁(yè)面的可見(jiàn)性,頁(yè)面的可見(jiàn)性確定了每個(gè)頁(yè)面是否包含死亡元組。清理過(guò)程可以跳過(guò)沒(méi)有死亡元組的頁(yè)面。
如圖,假設一個(gè)表包含三個(gè)頁(yè)面,第0號頁(yè)和第2號頁(yè)包含死亡元組,但是第一號頁(yè)不包含死亡元組,在可見(jiàn)性映射中保存著(zhù)包含死亡元組的信息,則在清理過(guò)程中,會(huì )參考VM,跳過(guò)第一個(gè)頁(yè)面清理下邊的頁(yè)面。
每個(gè)VM 文件后綴_vm保存,如一個(gè)表文件的relfilenode是2612,則VM文件為2612_vm,VM在9.6版本做了加強,除了顯示頁(yè)面可見(jiàn)性,還包含了頁(yè)面中原則是否全部?jì)鼋Y的信息。
凍結過(guò)程分兩種模式:惰性模式和迫切模式。
惰性模式在開(kāi)始凍結處理時(shí),PG會(huì )計算freezelimit_txid,并凍結t_xmin小于freezelimit_txid的元組,
freezelimit_txid=(OldestXmin-vacuum_freeze_min_age)
OldestXmin是當前正在運行的事務(wù)中最早的事務(wù)標識,vacuum_freeze_min_age是一個(gè)配置參數(默認為50000000)
迫切模式 9.5版本之前會(huì )掃描所有頁(yè)以檢查表中的所有元組,更新相關(guān)的系統目錄,并在可能的情況下刪除不必要的文件和clog頁(yè)。
滿(mǎn)足pg_database.datfrozenxid <(OldestXmin-vacuum_freeze_table_age)時(shí),會(huì )觸發(fā)迫切模式,vacuum_freeze_table_age 默認值為150000000。
凍結每個(gè)表后,目標表的pg_class.relfrozenxid被更新。 在完成vacuum處理之前,必要時(shí)更新pg_database.datfrozenxid。每個(gè)pg_database.datfrozenxid列在相應的數據庫中保存最小pg_class.relfrozenxid。
9.6版本進(jìn)行了VM與凍結過(guò)程,新VM包含了每個(gè)頁(yè)面中所有元組是否被全部?jì)鼋Y的信息,在迫切模式下進(jìn)行凍結處理時(shí),可以跳過(guò)僅包含凍結元組的頁(yè)面。
帶有freeze的vacuum會(huì )強制凍結指定表中的所有事務(wù)標識,而且freezeLimit會(huì )被設置為OldestXmin而不是OldestXmin - vacuum_freezre_min_age。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站