還分不清bin log 、redo log 跟 undo log?

前言

MySQL 日志包含了錯(cuò)誤日志摊沉、查詢(xún)?nèi)罩境Р啤⒙樵?xún)?nèi)罩居蟛尽⑹聞?wù)日志、二進(jìn)制日志等璃饱,如果存儲(chǔ)引擎使用的是 InnoDB 与斤,二進(jìn)制日志(binlog)和事務(wù)日志(包括redo log和undo log) 是肯定繞不過(guò)去的,本篇接下來(lái)詳細(xì)為大家介紹這三種日志荚恶。

redo log

為什么要有 redo log 撩穿?

我們都清楚,事務(wù)的四大特性其中有一個(gè)是持久性裆甩,簡(jiǎn)單的說(shuō)就是只要事務(wù)提交成功冗锁,對(duì)數(shù)據(jù)庫(kù)做的修改就會(huì)被永久保存下來(lái),不會(huì)因?yàn)槿魏卧蛟倩氐皆瓉?lái)的狀態(tài)嗤栓。

MySQL 是怎么樣保證持久性的呢冻河?最簡(jiǎn)單的做法是在每次事務(wù)提交的時(shí)候,將該事務(wù)涉及修改的數(shù)據(jù)頁(yè)全部刷新回磁盤(pán)中茉帅,可是這么做存在嚴(yán)重的性能問(wèn)題:

  1. 單個(gè)事務(wù)可能涉及修改多個(gè)數(shù)據(jù)頁(yè)叨叙,并且數(shù)據(jù)頁(yè)在物理上并不連續(xù),使用隨機(jī)IO寫(xiě)入性能太差堪澎。

  2. Innodb是以頁(yè)為單位進(jìn)行磁盤(pán)交互的擂错,一個(gè)事務(wù)有可能只會(huì)修改一個(gè)數(shù)據(jù)頁(yè)中的幾個(gè)字節(jié),如果這時(shí)候?qū)⑼暾臄?shù)據(jù)頁(yè)刷回磁盤(pán)的話(huà)樱蛤,很浪費(fèi)資源钮呀。

因此 MySQL 設(shè)計(jì)出了redo log,當(dāng)一條記錄更新的時(shí)候昨凡, InnoDB 引擎會(huì)先把記錄寫(xiě)到 redo log 里面去爽醋,同時(shí)更新內(nèi)存,這樣就算這條數(shù)據(jù)更新成功了便脊,完美地解決了性能問(wèn)題(文件更小并且是順序IO)蚂四。

注意此時(shí)數(shù)據(jù)并沒(méi)有更新到磁盤(pán)上,InnoDB 會(huì)在恰當(dāng)?shù)臅r(shí)候把這條記錄更新到磁盤(pán)上去。這種先寫(xiě)日志然后再將數(shù)據(jù)刷盤(pán)的機(jī)制遂赠,有個(gè)專(zhuān)有名詞——WAL(Write-ahead logging)久妆。

redo log 如何刷到磁盤(pán)的呢?

redo log包含兩部分:

  • 內(nèi)存中的日志緩沖(redo log buffer)

  • 磁盤(pán)上的日志文件(redo log file)

每執(zhí)行一條DML語(yǔ)句跷睦,數(shù)據(jù)庫(kù)先將記錄寫(xiě)入redo log buffer筷弦,然后后續(xù)某個(gè)時(shí)間點(diǎn)再一次性將多個(gè)操作記錄寫(xiě)到redo log file。MySQL 一共支持三種寫(xiě)入redo log file的時(shí)機(jī)送讲,通過(guò)參數(shù) innodb_flush_log_at_trx_commit 進(jìn)行配置奸笤,如下圖所示:

image.png

bin log

bin log 是 MySQL 的邏輯日志,由Server層進(jìn)行記錄哼鬓,用于記錄數(shù)據(jù)庫(kù)執(zhí)行的寫(xiě)入性操作(不包括查詢(xún))信息监右,以二進(jìn)制的形式保存在磁盤(pán)中。無(wú)論你使用的是任何的存儲(chǔ)引擎异希,mysql數(shù)據(jù)庫(kù)都會(huì)記錄binlog日志健盒。

與redo log日志一樣,binlog也有自己的刷盤(pán)策略称簿,通過(guò)sync_binlog參數(shù)控制:

  • 0 :每次提交事務(wù)前將binlog寫(xiě)入os cache扣癣,由操作系統(tǒng)控制什么時(shí)候刷到磁盤(pán)

  • 1 :采用同步寫(xiě)磁盤(pán)的方式來(lái)寫(xiě)binlog,不使用os cache來(lái)寫(xiě)binlog

  • N :當(dāng)每進(jìn)行n次事務(wù)提交之后憨降,調(diào)用一次fsync() os cache中的binlog強(qiáng)制刷到磁盤(pán)

bin log 和 redo log 都用于記錄的修改之后的值父虑,那么它們之間究竟有什么區(qū)別呢?

redo log 和 binlog 的區(qū)別

主要有以下三方面:

  1. binlog 是 MySQL 的 Server 層實(shí)現(xiàn)的授药,所有的引擎都是可以的士嚎。redo log是InnoDB的日志。如果不使用InnoDB引擎悔叽,是沒(méi)有redo log的莱衩。

  2. binlog是邏輯日志,記錄的是對(duì)哪一個(gè)表的哪一行做了什么修改娇澎;redo log是物理日志笨蚁,記錄的是對(duì)哪個(gè)數(shù)據(jù)頁(yè)中的哪個(gè)記錄做了什么修改,可以理解為對(duì)磁盤(pán)上的哪個(gè)數(shù)據(jù)做了修改趟庄。

  3. redo log 是有固定大小的括细,所以它的空間會(huì)用完,如果用完的話(huà)戚啥,一定要進(jìn)行一些寫(xiě)入磁盤(pán)的操作才可以繼續(xù); binlog 是可以追加寫(xiě)入的勒极,也就是 binlog 沒(méi)有空間的概念,一直寫(xiě)就行了

undo log

數(shù)據(jù)庫(kù)事務(wù)四大特性中有一個(gè)是原子性虑鼎,原子性指對(duì)數(shù)據(jù)庫(kù)的一系列操作,要么全部成功,要么全部失敗炫彩,不可能出現(xiàn)部分成功的情況匾七。實(shí)際上,原子性底層就是通過(guò)undo log實(shí)現(xiàn)的江兢。

undo log主要記錄了數(shù)據(jù)的邏輯變化昨忆,比如一條UPDATE語(yǔ)句,對(duì)應(yīng)一條相反UPDATE的undo log杉允,一條INSERT語(yǔ)句邑贴,對(duì)應(yīng)一條DELETE的undo log,這樣在發(fā)生錯(cuò)誤時(shí)叔磷,就能回滾到事務(wù)之前的數(shù)據(jù)狀態(tài)拢驾。

undo log 同時(shí)也是MVCC(多版本并發(fā)控制)實(shí)現(xiàn)的關(guān)鍵,這部分公眾號(hào)之前有講過(guò)改基,不再贅述繁疤。

總結(jié)

  • redo log是InnoDB存儲(chǔ)引擎的一種日志,主要作用是崩潰恢復(fù)秕狰,刷盤(pán)策略參數(shù) innodb_flush_log_at_trx_commit 推薦設(shè)置成2稠腊。

  • binlog是MySQL Server層的一種日志,主要作用是歸檔鸣哀。

  • undo log是InnoDB存儲(chǔ)引擎的一種日志架忌,主要作用是回滾。

轉(zhuǎn)載:https://mp.weixin.qq.com/s/gb0Ity1TyVR50Dn5QsYWTg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末我衬,一起剝皮案震驚了整個(gè)濱河市叹放,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌低飒,老刑警劉巖许昨,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褥赊,居然都是意外死亡糕档,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)拌喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)速那,“玉大人,你說(shuō)我怎么就攤上這事尿背《搜觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵田藐,是天一觀的道長(zhǎng)荔烧。 經(jīng)常有香客問(wèn)我吱七,道長(zhǎng),這世上最難降的妖魔是什么鹤竭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任踊餐,我火速辦了婚禮,結(jié)果婚禮上臀稚,老公的妹妹穿的比我還像新娘吝岭。我一直安慰自己,他們只是感情好吧寺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窜管。 她就那樣靜靜地躺著,像睡著了一般稚机。 火紅的嫁衣襯著肌膚如雪幕帆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天抒钱,我揣著相機(jī)與錄音蜓肆,去河邊找鬼。 笑死谋币,一個(gè)胖子當(dāng)著我的面吹牛仗扬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕾额,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼早芭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诅蝶?” 一聲冷哼從身側(cè)響起退个,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎调炬,沒(méi)想到半個(gè)月后语盈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缰泡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年刀荒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棘钞。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缠借,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宜猜,到底是詐尸還是另有隱情泼返,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布姨拥,位于F島的核電站绅喉,受9級(jí)特大地震影響渠鸽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹疫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一拱绑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丽蝎,春花似錦、人聲如沸膀藐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)额各。三九已至国觉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虾啦,已是汗流浹背麻诀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傲醉,地道東北人蝇闭。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像硬毕,于是被迫代替她去往敵國(guó)和親呻引。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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