MySQL之Redo log

mysql

Redo log是什么?

MySQL數(shù)據(jù)庫作為現(xiàn)在互聯(lián)網(wǎng)公司內(nèi)最流行的關(guān)系型數(shù)據(jù)庫贫悄,相信大家都有工作中使用過园骆。InnoDB是MySQL里最為常用的一種存儲引擎寺晌,主要面向在線事務(wù)處理(OLTP)的應(yīng)用。今天就讓我們來探究一下InnoDB是如何一步一步實現(xiàn)事務(wù)的祖能,這次我們先講事務(wù)實現(xiàn)的redo log蟆沫。

首先我們先明確一下InnoDB的修改數(shù)據(jù)的基本流程籽暇,當(dāng)我們想要修改DB上某一行數(shù)據(jù)的時候,InnoDB是把數(shù)據(jù)從磁盤讀取到內(nèi)存的緩沖池上進行修改饭庞。這個時候數(shù)據(jù)在內(nèi)存中被修改戒悠,與磁盤中相比就存在了差異,我們稱這種有差異的數(shù)據(jù)為臟頁舟山。InnoDB對臟頁的處理不是每次生成臟頁就將臟頁刷新回磁盤绸狐,這樣會產(chǎn)生海量的IO操作,嚴重影響InnoDB的處理性能累盗。對于此寒矿,InnoDB有一套完善的處理策略,與我們這次主題關(guān)系不大若债,表過不提符相。既然臟頁與磁盤中的數(shù)據(jù)存在差異,那么如果在這期間DB出現(xiàn)故障就會造成數(shù)據(jù)的丟失蠢琳。為了解決這個問題啊终,redo log就應(yīng)運而生了。

Redo log工作原理

在講Redo log工作原理之前挪凑,先來學(xué)習(xí)一下MySQL的一些基礎(chǔ):

一孕索、日志類型

redo log在數(shù)據(jù)庫重啟恢復(fù)的時候被使用,因為其屬于物理日志的特性躏碳,恢復(fù)速度遠快于邏輯日志。而我們經(jīng)常使用的binlog就屬于典型的邏輯日志。

二菇绵、 checkpoint

坦白來講checkpoint本身是比較復(fù)雜的肄渗,checkpoint所做的事就是把臟頁給刷新回磁盤。所以咬最,當(dāng)DB重啟恢復(fù)時翎嫡,只需要恢復(fù)checkpoint之后的數(shù)據(jù)。這樣就能大大縮短恢復(fù)時間永乌。當(dāng)然checkpoint還有其他的作用惑申。

三、 LSN(Log Sequence Number)

LSN實際上就是InnoDB使用的一個版本標(biāo)記的計數(shù)翅雏,它是一個單調(diào)遞增的值圈驼。數(shù)據(jù)頁和redo log都有各自的LSN。我們可以根據(jù)數(shù)據(jù)頁中的LSN值和redo log中LSN的值判斷需要恢復(fù)的redo log的位置和大小望几。

四绩脆、 工作原理

好的,現(xiàn)在我們來看看redo log的工作原理橄抹。說白了靴迫,redo log就是存儲了數(shù)據(jù)被修改后的值。當(dāng)我們提交一個事務(wù)時楼誓,InnoDB會先去把要修改的數(shù)據(jù)寫入日志玉锌,然后再去修改緩沖池里面的真正數(shù)據(jù)頁。

我們著重看看redo log是怎么一步步寫入磁盤的疟羹。redo log本身也由兩部分所構(gòu)成即重做日志緩沖(redo log buffer)和重做日志文件(redo log file)主守。這樣的設(shè)計同樣也是為了調(diào)和內(nèi)存與磁盤的速度差異。InnoDB寫入磁盤的策略可以通過innodb_flush_log_at_trx_commit這個參數(shù)來控制阁猜。

當(dāng)該值為1時丸逸,當(dāng)然是最安全的,但是數(shù)據(jù)庫性能會受一定影響剃袍。

為0時性能較好黄刚,但是會丟失掉master thread還沒刷新進磁盤部分的數(shù)據(jù)。

這里我想簡單介紹一下master thread民效,這是InnoDB一個在后臺運行的主線程憔维,從名字就能看出這個線程相當(dāng)?shù)闹匾K龅闹饕ぷ靼ǖ幌抻冢核⑿氯罩揪彌_畏邢,合并插入緩沖业扒,刷新臟頁等。master thread大致分為每秒運行一次的操作和每10秒運行一次的操作舒萎。master thread中刷新數(shù)據(jù)程储,屬于checkpoint的一種。所以如果在master thread在刷新日志的間隙,DB出現(xiàn)故障那么將丟失掉這部分數(shù)據(jù)章鲤。

當(dāng)該值為2時摊灭,當(dāng)DB發(fā)生故障能恢復(fù)數(shù)據(jù)。但如果操作系統(tǒng)也出現(xiàn)宕機败徊,那么就會丟失掉帚呼,文件系統(tǒng)沒有及時寫入磁盤的數(shù)據(jù)。

這里說明一下皱蹦,innodb_flush_log_at_trx_commit設(shè)為非0的值煤杀,并不是說不會在master thread中刷新日志了。master thread刷新日志是在不斷進行的沪哺,所以redo log寫入磁盤是在持續(xù)的寫入沈自。

五、 宕機恢復(fù)

DB宕機后重啟凤粗,InnoDB會首先去查看數(shù)據(jù)頁中的LSN的數(shù)值酥泛。這個值代表數(shù)據(jù)頁被刷新回磁盤的LSN的大小。然后再去查看redo log的LSN的大小嫌拣。如果數(shù)據(jù)頁中的LSN值大說明數(shù)據(jù)頁領(lǐng)先于redo log刷新回磁盤柔袁,不需要進行恢復(fù)。反之需要從redo log中恢復(fù)數(shù)據(jù)异逐。

redo log的結(jié)構(gòu)

其實這一部分內(nèi)容日常工作中很少涉及到捶索,稍微了解一下就足夠了。

一灰瞻、 log block

Redo log的存儲都是以 塊(block) 為單位進行存儲的腥例,每個塊的大小為512字節(jié)。同磁盤扇區(qū)大小一致酝润,可以保證塊的寫入是原子操作燎竖。

塊由三部分所構(gòu)成,分別是 日志塊頭(log block header)要销,日志塊尾(log block tailer)构回,日志本身
日志頭占用12字節(jié)疏咐,日志尾占用8字節(jié)纤掸。故每個塊實際存儲日志的大小為492字節(jié)。

二浑塞、 log group

一個日志文件由多個塊所構(gòu)成借跪,多個日志文件形成一個重做日志文件組(redo log group)。不過酌壕,log group是一個邏輯上的概念掏愁,真實的磁盤上不會這樣存儲歇由。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市托猩,隨后出現(xiàn)的幾起案子印蓖,更是在濱河造成了極大的恐慌辽慕,老刑警劉巖京腥,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溅蛉,居然都是意外死亡公浪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門船侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欠气,“玉大人,你說我怎么就攤上這事镜撩≡て猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵袁梗,是天一觀的道長宜鸯。 經(jīng)常有香客問我,道長遮怜,這世上最難降的妖魔是什么淋袖? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮锯梁,結(jié)果婚禮上即碗,老公的妹妹穿的比我還像新娘。我一直安慰自己陌凳,他們只是感情好剥懒,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著合敦,像睡著了一般初橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛤肌,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天壁却,我揣著相機與錄音,去河邊找鬼裸准。 笑死展东,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炒俱。 我是一名探鬼主播盐肃,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼爪膊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砸王?” 一聲冷哼從身側(cè)響起推盛,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谦铃,沒想到半個月后耘成,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡驹闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年瘪菌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘹朗。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡师妙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屹培,到底是詐尸還是另有隱情默穴,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布褪秀,位于F島的核電站蓄诽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏溜歪。R本人自食惡果不足惜若专,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝴猪。 院中可真熱鬧调衰,春花似錦、人聲如沸自阱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沛豌。三九已至趋箩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間加派,已是汗流浹背叫确。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芍锦,地道東北人竹勉。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓荷逞,卻偏偏與公主長得像跃闹,于是被迫代替她去往敵國和親役听。 傳聞我的和親對象是個殘疾皇子雳窟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容