(以innodb存儲引擎為例)
一肤视、幾個(gè)基本知識介紹
1.InnoDB有一種緩沖池的技術(shù),將磁盤讀到的頁放到一塊內(nèi)存區(qū)域中。
? ? 我們讀取數(shù)據(jù)時(shí)枣接,并不是只將滿足條件的數(shù)據(jù)加載到內(nèi)存中证舟,而是一塊數(shù)據(jù)(局部性原理硕旗,我們需要的數(shù)據(jù)的附近的數(shù)據(jù)也有可能在未來會被讀取)女责,也就是數(shù)據(jù)頁漆枚;
頁是一個(gè)存儲引擎從磁盤讀取數(shù)據(jù)到內(nèi)存的最小單位;
2.臟頁
修改數(shù)據(jù)的時(shí)候抵知,會先修改內(nèi)存緩沖區(qū)(buffer pool)里面的頁墙基;內(nèi)存的數(shù)據(jù)頁和磁盤數(shù)據(jù)不一致,即為臟頁刷喜。
3.刷臟
將緩沖區(qū)的數(shù)據(jù)寫入磁盤(每隔一段時(shí)間残制,一次性完成多個(gè)修改)
4.重做日志 redo log
為防止數(shù)據(jù)庫宕機(jī)、一些刷臟操作未能執(zhí)行造成的數(shù)據(jù)丟失掖疮,InnoDB會將所有對數(shù)據(jù)頁的修改操作專門寫入redo log(數(shù)據(jù)來自buffer pool緩沖區(qū))初茶。
疑問:寫入redolog也是對磁盤進(jìn)行操作,為什么不直接寫入db文件,而要先寫日志再寫數(shù)據(jù)文件浊闪?
原因:
刷盤是隨機(jī)I/O恼布,它會一次次的找到我們需要修改的數(shù)據(jù)并完成修改螺戳,速度緩慢;
而redolog記錄的是“在數(shù)據(jù)頁上做了什么修改”折汞,如果我們找到了第一條要修改的數(shù)據(jù)倔幼,那么后面我們所需的數(shù)據(jù)一定在這條數(shù)據(jù)的后面,這也是順序I/O字支。
優(yōu)點(diǎn):A.延遲刷盤時(shí)機(jī)凤藏,提升系統(tǒng)的吞吐量;B.崩潰恢復(fù)堕伪。
其他特點(diǎn):
-redo log是物理日志揖庄,記錄的是“在某個(gè)數(shù)據(jù)頁上做了什么修改”;
-循環(huán)寫欠雌,空間固定會用完蹄梢,用完后覆蓋之前完成的記錄。
5.undo log?
記錄事務(wù)發(fā)生之前的數(shù)據(jù)狀態(tài)(如果修改數(shù)據(jù)時(shí)出現(xiàn)異常富俄,可以用undo log來實(shí)現(xiàn)回滾操作)
6.歸檔日志 bin log
記錄所有的DDL和DML語句禁炒,可用于主從復(fù)制和數(shù)據(jù)恢復(fù):
????A.用于復(fù)制,在主從復(fù)制中霍比,從庫利用主庫上的binlog進(jìn)行重播幕袱,實(shí)現(xiàn)主從同步。
????B.用于數(shù)據(jù)庫的基于時(shí)間點(diǎn)的還原悠瞬。? ? (每日備份的數(shù)據(jù)庫+bin log完成數(shù)據(jù)恢復(fù))
邏輯日志们豌,記錄的是這個(gè)語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”浅妆。
二望迎、更新語句的執(zhí)行過程簡述
1.先從內(nèi)存或者磁盤中拿到這條數(shù)據(jù);
2.執(zhí)行器對數(shù)據(jù)狀態(tài)進(jìn)行修改凌外;
3.將原來的數(shù)據(jù)狀態(tài)記錄到undo log辩尊;
4.調(diào)用存儲引擎的API接口,在內(nèi)存(buffer pool)中更新數(shù)據(jù)狀態(tài)康辑;并且摄欲,將修改后的數(shù)據(jù)記錄到redo log,此時(shí)redo log進(jìn)入prepare狀態(tài),并告知執(zhí)行器疮薇;
5.執(zhí)行器收到通知后記錄binlog蒿涎,并把 binlog 寫入磁盤;
6.調(diào)用存儲引擎接口惦辛,設(shè)置redo log為commit狀態(tài)。更新完成仓手。
注:當(dāng)對應(yīng)事務(wù)的臟頁寫入到磁盤之后胖齐,redo log的使命也就完成了玻淑,重做日志占用的空間就可以重用(被覆蓋)。
有理解錯(cuò)誤的地方呀伙,望留言指正补履,謝謝!