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