日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【MySQL】redo log --- 刷入磁盘过程

發(fā)布時間:2023/12/9 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MySQL】redo log --- 刷入磁盘过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。