MySQL Redo與Undo日志詳細(xì)解析
1. Redo日志的介紹
Redo日志是物理日志,記錄的是頁面的變化。
1.1 Redo日志的作用
- 提升數(shù)據(jù)庫寫入效率
- 保證數(shù)據(jù)庫不丟數(shù)據(jù),進(jìn)行數(shù)據(jù)恢復(fù)
1.2 Redo日志的格式與類型
所謂REDO的組織方式,就是如何把需要的REDO內(nèi)容記錄到磁盤文件中,以方便高效的REDO寫入,讀取,恢復(fù)以及清理。我們這里把REDO從上到下分為三層:邏輯REDO層、物理REDO層和文件層。
- 邏輯REDO層
這一層是真正的REDO內(nèi)容,順序的數(shù)據(jù)流,REDO由多個(gè)不同Type的多個(gè)REDO記錄收尾相連組成,有全局唯一的遞增的偏移sn,InnoDB會在全局log_sys中維護(hù)當(dāng)前sn的最大值,并在每次寫入數(shù)據(jù)時(shí)將sn增加REDO內(nèi)容長度。
- 物理REDO層
磁盤是塊設(shè)備,InnoDB中也用Block的概念來讀寫數(shù)據(jù),一個(gè)Block的長度OS_FILE_LOG_BLOCK_SIZE等于磁盤扇區(qū)的大小512B,每次IO讀寫的最小單位都是一個(gè)Block。
- 文件層
最終REDO會被寫入到REDO日志文件中,并且日志文件是循環(huán)寫入的
2. 寫入Redo日志的流程(MTR)
- 用戶線程的操作會首先寫進(jìn)
log buffer
中 log buffer
中的日志會順序?qū)懭隦edo邏輯日志中- 之后會落盤持久化存儲到磁盤上
- 之后通知用戶已經(jīng)存儲完成了
3. Checkpoint機(jī)制
Checkpoint是Redo日志中臟頁的標(biāo)記位,有以下兩個(gè)作用:
- 維護(hù)Redo日志,方便清理
- 減小重啟的工作量
數(shù)據(jù)庫恢復(fù)流程:
- 讀取 checkpoint 信息•從 checkpoint 位置開始讀取剩余日志
- 解析日志并按 space_no 與 page_id 構(gòu)建 hash 表
- 應(yīng)用 Redo 日志,Redo日志回放保證冪等性
- 解析 binlog 構(gòu)建 xid 列表
- 掃描回滾段構(gòu)建待提交事務(wù)列表
- 回滾掉未在 xid 列表中的事務(wù)
4. Undo日志介紹
Undo log是邏輯日志,記錄的是數(shù)據(jù)的增量變化,它的作用是保證事務(wù)的原子性和事務(wù)并發(fā)控制??梢杂糜谑聞?wù)回滾,以及提供多版本機(jī)制(MVCC),解決讀寫沖突和一致性讀的問題。
5. MVCC
MVCC的意義:
- 讀寫互不阻塞;
- 降低死鎖概率;
- 實(shí)現(xiàn)一致性讀。
UndoLog在MVCC的作用:
- 每個(gè)事務(wù)有一個(gè)單增的事務(wù)ID;
- 數(shù)據(jù)頁的行記錄中包含了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR;
- DB_ROLL_PTR將數(shù)據(jù)行的所有快照記錄都通過鏈表的結(jié)構(gòu)串聯(lián)了起來。
到此這篇關(guān)于MySQL Redo與Undo日志詳細(xì)解析的文章就介紹到這了,更多相關(guān)MySQL Redo與Undo 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入理解MySQL重做日志 redo log
- mysql日志文件之undo?log和redo?log
- mysql日志系統(tǒng)redo log和bin log介紹
- MySQL三大日志(binlog、redo?log和undo?log)圖文詳解
- mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log)
- 詳解MySQL事務(wù)日志redo log
- 真的了解MySQL中的binlog和redolog區(qū)別
- mysql中 redo日志詳解
- MySQL三大日志之binlog、redoLog、undoLog詳細(xì)講解
- MySQL8.0設(shè)置redo緩存大小的實(shí)現(xiàn)
相關(guān)文章
mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問題(精華總結(jié))
這篇文章主要介紹了mysql 8.0.18各版本安裝及安裝中出現(xiàn)的問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12MySQL count(1)、count(*)、count(字段)的區(qū)別
COUNT在數(shù)據(jù)庫行數(shù)統(tǒng)計(jì)中被廣泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的區(qū)別嗎,本文就想的介紹一下,感興趣的可以了解一下2021-12-12Mysql數(shù)據(jù)庫報(bào)錯(cuò)2003?Can't?connect?to?MySQL?server?on?
最近在用mysql,打開mysql的圖形化界面要連接時(shí)出現(xiàn)2003錯(cuò)誤,所以下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫報(bào)錯(cuò)2003?Can't?connect?to?MySQL?server?on?'localhost'?(10061)的解決方式,需要的朋友可以參考下2022-09-09MySQL數(shù)據(jù)庫中case表達(dá)式的用法示例
這篇文章主要介紹了MySQL數(shù)據(jù)庫中case表達(dá)式用法的相關(guān)資料,MySQL的CASE表達(dá)式用于條件判斷,返回不同結(jié)果,適用于SELECT、UPDATE和ORDERBY,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02