深入理解緩衝區(十三)

2021-08-26 07:20:36 字數 2883 閱讀 5370

前述介紹的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等功能。過期...