【MySQL】redo log --- 刷入磁盘过程
1、redo log基本概念
redo log的相關(guān)概念這里就不再過多闡述,網(wǎng)上有非常多的好的資料,可以看下縹緲大神的文章:https://www.cnblogs.com/cuisi/p/6525077.html,個(gè)人感覺介紹的非常詳細(xì)。
?
2、數(shù)據(jù)更改過程簡(jiǎn)述
MySQL 在更新數(shù)據(jù)的時(shí)候,都是將數(shù)據(jù)先從磁盤拉到 buffer pool 中,在buffer pool中修改完成后再寫到磁盤中,也就是說MySQL中數(shù)據(jù)的更改都是要經(jīng)過buffer pool的。
回到這個(gè)更新數(shù)據(jù)的過程中來看:當(dāng)數(shù)據(jù)在buffer pool中更改完成的這一刻,更新后的數(shù)據(jù)是“最新”的,因?yàn)榇藭r(shí)磁盤中的數(shù)據(jù)還是更改前的“舊數(shù)據(jù)”,而我們都是將磁盤中已經(jīng)持久化的數(shù)據(jù)作為“標(biāo)準(zhǔn)數(shù)據(jù)”,因此此時(shí) buffer pool 中的“最新”數(shù)據(jù)也常人們被稱為“臟數(shù)據(jù)(dirty data)”。
比如將 update 一百行記錄作為一個(gè)事務(wù),在這個(gè)事務(wù)執(zhí)行過程中會(huì)將更新后的數(shù)據(jù)先寫入redo log buffer,redo log buffer 再將數(shù)據(jù)刷入(請(qǐng)注意刷入這個(gè)用語(yǔ),而非寫入,后面會(huì)詳細(xì)介紹)redo log中(這點(diǎn)和 binlog 不同,binlog 是在事務(wù) commit 后一次性寫入,而 redo log 在事務(wù)執(zhí)行過程中就會(huì)寫入)。
?
3、redo log刷新過程
首先需要明白兩個(gè)概念:
fsync:傳統(tǒng)的unix系統(tǒng)在內(nèi)核中都設(shè)有緩沖區(qū),并且大多數(shù)的I/O都會(huì)通過緩沖進(jìn)行。當(dāng)將數(shù)據(jù)寫入文件時(shí),內(nèi)核通常先將該數(shù)據(jù)復(fù)制到其中一個(gè)緩沖區(qū)中,如果該緩沖區(qū)尚未寫滿,則并不將其排入輸出隊(duì)列,而是等待其寫滿或者當(dāng)內(nèi)核需要重用該緩沖區(qū)以便存放其他磁盤塊數(shù)據(jù)時(shí),再將該緩沖排入輸出隊(duì)列,然后待其到達(dá)隊(duì)首時(shí),才進(jìn)行實(shí)際的 I/O 操作。這種輸出方式被成為延遲寫。
unix提供了sync、fsync、fdatasync三個(gè)函數(shù),sync只是將所有修改過的塊放入寫隊(duì)列,不管它是否寫磁盤結(jié)束就返回;fsync會(huì)等待寫磁盤結(jié)束才會(huì)返回。
O_DIRECT選項(xiàng):O_DIRECT選項(xiàng)是Linux文件寫入中的一個(gè)選項(xiàng),開啟了這個(gè)選項(xiàng)以后,數(shù)據(jù)就可以跳過系統(tǒng)層的緩存,直接寫入磁盤。
redo log并沒有打開O_DIRECT選項(xiàng),所以redo log buffer只是先刷入redo log file,此時(shí)刷入的數(shù)據(jù)并沒有落到磁盤上,而是放在文件系統(tǒng)的緩存中。之后為了確保redo log寫入磁盤,就通過fsync操作將數(shù)據(jù)寫入磁盤。(redo log buffer到redo log file只是“刷入”的過程,這個(gè)時(shí)候并沒有寫入磁盤,而是寫入了OS層的文件系統(tǒng)緩存。)
4、重要參數(shù)
innodb_flush_log_at_trx_commit:用來控制redo log刷新到磁盤的策略。
默認(rèn)值是1,表示每次事務(wù)提交的時(shí)候都調(diào)用fsync來寫入到磁盤;
0表示事務(wù)在執(zhí)行過程中,日志一直放在redo log buffer中,但是在事務(wù)commit的時(shí)候,不寫入redo log file,而是通過master線程每秒操作一次,從redo log buffer寫入到redo log file中。
2表示事務(wù)提交時(shí)將redo log buffer刷入redo log file,也即刷入系統(tǒng)文件緩存中,不進(jìn)行fsync操作,由系統(tǒng)來進(jìn)行fsync操作。此時(shí)如果數(shù)據(jù)庫(kù)層宕機(jī),則不會(huì)丟失redo log,但是如果服務(wù)器宕機(jī),這個(gè)時(shí)候文件系統(tǒng)中的緩存還沒有fsync到磁盤文件中,這個(gè)時(shí)候就會(huì)丟失這一部分?jǐn)?shù)據(jù)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/haohaozhang/p/10093182.html
總結(jié)
以上是生活随笔為你收集整理的【MySQL】redo log --- 刷入磁盘过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 大数据小白系列——HDFS(1)
- 下一篇: 前端小知识点(2):普通字符串和new
