前述介紹的buf,是一種雙向的快取,即「向外存發出讀請求à讀入資料到緩衝區」和「緩衝區中的資料被更新à寫出到外存」。
在postgresql系統中,還存在一種單向快取,是redo日誌的快取,此種快取,是系統啟動時讀日誌檔案建立的,在執行過程中,快取資料庫引擎操作產生的rodo日誌資料,然後按照一種規則,不斷從記憶體刷出資料到外存,方向是從內到外,所以是單向快取。
日誌快取的初始化
呼叫xlogshmeminit函式完成日誌快取區的初始化工作(主要是在共享記憶體中分配一塊區域-- xlogctl,以當作日誌快取使用)。
主要**
主要函式
作用
呼叫關係
xloginsert
把記憶體中生成的日誌資訊插入到日誌快取中
xloginsert[1]
writezeropagexlogrec
writetruncatexlogrec
createdb
movedb
movedb
remove_dbtablespaces
gininsertvalue
writelistpage
ginheaptuplefastinsert
shiftlist
createpostingtree
ginbuild
ginupdatestats
xlogvacuumpage
gindeletepage
gistbuild
gistplacetopage
gistplacetopage
gistnewroot
gistbulkdelete
gistcontinueinsert
gistxloginsertcompletion
heap_insert
heap_delete
heap_lock_tuple
heap_inplace_update
log_heap_cleanup_info
log_heap_clean
log_heap_freeze
log_heap_update
log_newpage
createmultixactid
writemzeropagexlogrec
_bt_insertonpg
_bt_split
_bt_newroot
_bt_getroot
_bt_log_reuse_page
_bt_delitems_vacuum
_bt_delitems_delete
_bt_pagedel
write_relmap_file
definesequence
altersequenceinternal
nextval_internal
do_setval
logcurrentrunningxacts
logacces***clusivelocks
relationcreatestorage
relationtruncate
createtablespace
droptablespace
endprepare
recordtransactioncommitprepared
recordtransactionabortprepared
assigntransactionid
recordtransactioncommit
recordtransactionabort
createcheckpoint
xlogputnextoid
requestxlogswitch
xlogreportparameters
pg_stop_backup
xlogwrite
呼叫write函式()把日誌快取的內容刷出到外存。呼叫xlogfileclose和xlogfileopen進行檔案切換(日誌檔案寫滿了,關掉當前日誌檔案,開啟下乙個日誌檔案寫入日誌資訊)
xlogwrite
xloginsert
advancexlinsertbuffer
xlogflush
xlogbackgroundflush
xlogflush
把日誌快取的內容刷出到外存(呼叫xlogwrite)
xlogflush
flushbuffer
writetruncatexlogrec
write_relmap_file
slruphysicalwritepage
relationtruncate
endprepare
recordtransactioncommitprepared
recordtransactionabortprepared
recordtransactioncommit
xact_redo_commit
createcheckpoint
advancexlinsertbuffer
寫如日誌時,空餘空間不夠,則預先分配一塊buf(方式是:先呼叫xlogwrite刷出一部分日誌,然後把日誌資訊放入日誌快取)
advancexlinsertbuffer
xloginsert(3次呼叫)
createcheckpoint
[1] 通過呼叫關係,可以看到,資料庫中有什麼樣的操作需要寫日誌。幾乎所有操作,只要是需要被恢復的(和acid特性緊密相關),都需要構造好要恢復的資料,然後呼叫xloginsert把資訊儲存在日誌中
深入理解緩衝區(九)
4.1.4.3 內外存位址是如何對映的 1 快取對應的內外存的對映關係 typedef struct buftag relfilenode rnode physical relation identifier 資料庫物件的位置標識,具體說明見下 forknumber forknum 可以檢視 rel...
深入理解緩衝區(二)
池,停水曰池。廣韻 所以,池,能蓄積物。引申後,池能蓄積執行緒,則稱之為執行緒池 池能蓄積程序則稱之為程序池。另外常見的還有資料庫連線池 iis6.0 中的位址池 記憶體池 1 等等。其中,記憶體池的概念,類似緩衝區。我這裡討論的,著重於 postgresql 資料庫系統的實現例項。cache 偏於...
深入理解緩衝區(三)
3 快取的作用和常見場景 3.1 快取的作用 快取,可以把常用的一些 物件 暫且稱為物件 蓄積起來,供使用,這樣,將減少被快取物件的生成 銷毀等時間,如果物件被反覆使用,且其生成 銷毀需要花費時間,則快取這樣物件對於時間的節省可能很有效。快取元件提供retrieve add remove等功能。過期...