Buffer Cache結構及LRU, LRBA , Checkpoint Queue[final]
Buffer Cache結構:
連結串列為 Hash Chain "-->"
Buffer header裡面記錄的指標就指向buffer cache中的該資料塊本身
[hash bucket 0] --> [buffer header] --> [buffer header] --> [buffer header] ...
[hash bucket 1] --> [buffer header] ...
[hash bucket 2] --> [buffer header] --> [buffer header] ...
[hash bucket 3] --> [buffer header]
[hash bucket 4] --> [buffer header] --> [buffer header]
[hash bucket 5] --> [buffer header] --> [buffer header] --> [buffer header] ...
...
LRU: Least Recently Used,也就是指最近最少使用的buffer header連結串列。LRU連結串列串聯起來的buffer header都指向可用資料塊。buffer按照被使用的先後順序掛在LRU連結串列上,先被使用的buffer掛在LRU連結串列的後面,後被使用的buffer則被掛在LRU連結串列的前面。如果buffer被DML語句修改了,則該buffer會從LRU連結串列上摘下來。換句話說,LRU連結串列上的buffer header所指向的buffer都是可用資料塊。
檢查點佇列 (Checkpoint Queue,Dirty List) --
該佇列上串起來的都是髒資料塊所對應的buffer header。而每次DBWn寫髒資料塊時,也是從檢查點佇列上掃描髒資料塊,並將這些髒資料塊實際寫入資料檔案的。當寫完以後,DBWn會將這些已經寫入資料檔案的髒資料塊從檢查點佇列上摘下來。
檢查點佇列上的buffer header是按照資料塊第一次被修改的時間的先後順序來排列的。越早修改的資料塊的buffer header排在越前面,同時如果一個資料塊被修改了多次的話,在該連結串列上也只出現一次。buffer header還記錄了髒資料塊在第一次被修改時,所對應的重做條目在重做日誌檔案中的地址,也就是LRBA (Low Redo Block Address).
[buffer header0]->[buffer header2]->[buffer header3]->[buffer header4]->....
LRBA --
Redo log file中的LRBA (Low Redo Block Address) 表示髒資料塊第一次被修改時候所對應的重做條目在重做日誌檔案中的地址 (Low表示第一次修改)
[LRBA0][LRBA1][LRBA2][LRBA3][LRBA4][LRBA5][LRBA6]
檢查點位置(Checkpoint Position) --
表示出現系統崩潰後日志檔案中的重做條目恢復起點
當前檢查點佇列上的第一個buffer header,該buffer header中所記錄的LRBA 就是checkpoint position, 該檢查點位置記錄在控制檔案裡
DBWn負責寫檢查點佇列上的髒資料塊,而CKPT負責記錄當前檢查點佇列的第一個資料塊所對應的的重做條目在日誌檔案中的地址。而到底應該寫哪些髒資料塊,寫多少髒資料塊,則要到檢查點佇列上才能確定的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-677949/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 33、buffer_cache_3(redo的產生、LRBA、buffer cache裡的等待事件)事件
- LRU cache原理及go實現Go
- Leetcode LRU CacheLeetCode
- buffer cache深度分析及效能調整(四)
- buffer cache深度分析及效能調整(六)
- buffer cache深度分析及效能調整(五)
- IO之核心buffer----"buffer cache"
- Oracle Cache Buffer ChainsOracleAI
- DB BUFFER LRU 列表的latch等待
- Buffer Cache以及buffer busy waits/gc相關事件AIGC事件
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- 【Cache】將常用的“小表”快取到Buffer Cache快取
- buffer與cache的區別
- Linux Buffer/Cache 的區別Linux
- LRU cache快取簡單實現快取
- 用 Go 實現一個 LRU cacheGo
- 動手實現一個 LRU cache
- python自帶快取lru_cache用法及擴充套件(詳細)Python快取套件
- [20210527]enq KO - fast object checkpoint Final Blocker.txtENQASTObjectBloC
- PostgreSQL DBA(89) - Linux(Buffer vs Cache)SQLLinux
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- 清理buffer/cache/swap的方法梳理
- 資料結構之佇列(Queue)資料結構佇列
- js資料結構--佇列(queue)JS資料結構佇列
- LRU Cache的原理和python的實現Python
- InnoDB Buffer Pool改進LRU頁面置換
- ORACLE資料庫檢視ACQ(ACTIVE CHECKPOINT QUEUE)資訊Oracle資料庫
- 【體系結構】SCN與checkpoint(檢查點)
- Cache 和 Buffer 的區別在哪裡?
- Cache 和 Buffer 有什麼區別?
- Python 的快取機制: functools.lru_cachePython快取
- 通過原始碼學習@functools.lru_cache原始碼
- Python 中 lru_cache 的使用和實現Python
- Android快取機制-LRU cache原理與用法Android快取
- 【資料結構】棧(Stack)和佇列(Queue)資料結構佇列
- 從 LRU Cache 帶你看面試的本質面試
- 非易失性WAL BUFFER實現機制解析:checkpoint改造
- Leetcode LRU快取,陣列+結構體實現LeetCode快取陣列結構體
- Linux如何手動釋放Swap、Buffer和CacheLinux