MySQL innoDB——redo log/undo log

redo(記錄了事務(wù)的行為梢夯,可以很好的通過(guò)其對(duì)頁(yè)進(jìn)行“重做”操作)

  • 包含易失的redo log buffer和持久的redo log file兩部分
  • 存于redo log file(重做日志文件中)
  • 維護(hù)持久性
  • 頁(yè)操作

在一個(gè)事務(wù)中的每一次SQL操作之后都會(huì)寫(xiě)入一個(gè)redo log到buffer中,在最后COMMIT的時(shí)候众旗,必須先將該事務(wù)的所有日志寫(xiě)入到redo log file進(jìn)行持久化(這里的寫(xiě)入是順序?qū)懙模┪旮梗聞?wù)的COMMIT操作完成才算完成。

redo

參數(shù) innodb_flush_log_at_trx_commit 用來(lái)控制重做日志刷新到磁盤(pán)的策略,該參數(shù)有3個(gè)值:0几睛、1和2。
0:表示事務(wù)提交時(shí)不進(jìn)行寫(xiě)redo log file的操作粤攒,這個(gè)操作僅在master thread中完成(master thread每隔1秒進(jìn)行一次fsync操作)所森。
1:默認(rèn)值,表示每次事務(wù)提交時(shí)進(jìn)行寫(xiě)redo log file的操作夯接。
2:表示事務(wù)提交時(shí)將redo log寫(xiě)入文件焕济,不過(guò)僅寫(xiě)入文件系統(tǒng)的緩存中,不進(jìn)行fsync操作盔几。

對(duì)比binlog

binlog為了解決Mysql主從備份而產(chǎn)生 
* 內(nèi)部XA:redo log和bin log的數(shù)據(jù)一直性和完整性的保證 
* 外部XA:分布式事務(wù)

內(nèi)部XA(二段式提交)晴弃,由于需要遵循WAL原則,binlog的過(guò)程需要嵌入到事務(wù)提交的流程中: 
* prepare過(guò)程 
* commit過(guò)程

在MySQL數(shù)據(jù)庫(kù)中還有一種二進(jìn)制日志(binlog)逊拍,從表面上來(lái)看它和redo log很相似上鞠,都是記錄了對(duì)數(shù)據(jù)庫(kù)操作的日志,但是芯丧,它們有著非常大的不同芍阎。

  • redo log是在MySQL的InnoDB引擎層產(chǎn)生,而binlog則是在MySQL的上層產(chǎn)生缨恒,它不僅針對(duì)InnoDB引擎谴咸,其他任何引擎對(duì)于數(shù)據(jù)庫(kù)的更改都會(huì)產(chǎn)生binlog轮听。
  • 兩種日志記錄的內(nèi)容形式不同,binlog是一種邏輯日志岭佳,其記錄的是對(duì)應(yīng)的SQL語(yǔ)句血巍。而redo log則是記錄的物理格式日志,其記錄的是對(duì)于每個(gè)頁(yè)的修改驼唱。
  • 兩種日志記錄寫(xiě)入磁盤(pán)的時(shí)間點(diǎn)不同藻茂,binlog只在事務(wù)提交完成后一次性寫(xiě)入,而redo log在上面也說(shuō)了是在事務(wù)進(jìn)行中不斷被寫(xiě)入玫恳,這表現(xiàn)為日志并不是隨事務(wù)提交的順序進(jìn)行寫(xiě)入的辨赐。

undo

  • 分為insert undo log(insert,insert只對(duì)本身事務(wù)可見(jiàn)京办,對(duì)其他事務(wù)無(wú)影響)和update undo log(update/delete)
  • 存于數(shù)據(jù)庫(kù)中的undo segment(段)中
  • 用于回滾
  • 用于MVCC(實(shí)現(xiàn)非鎖定讀)掀序,讀取一行記錄時(shí),若已被其他事務(wù)占據(jù)惭婿,則通過(guò)undo讀取之前的版本
  • 維護(hù)原子性
  • 行操作(回滾行記錄到某個(gè)版本)
    undo是邏輯日志不恭,只是將數(shù)據(jù)庫(kù)邏輯的恢復(fù)到執(zhí)行語(yǔ)句或事務(wù)之前。

InnoDB存儲(chǔ)引擎的行結(jié)構(gòu)

InnoDB表數(shù)據(jù)的組織方式為主鍵聚簇索引财饥,二級(jí)索引中采用的是(索引鍵值, 主鍵鍵值)的組合來(lái)唯一確定一條記錄换吧。
InnoDB表數(shù)據(jù)為主鍵聚簇索引,mysql默認(rèn)為每個(gè)索引行添加了4個(gè)隱藏的字段,分別是:

  • DB_ROW_ID:InnoDB引擎中一個(gè)表只能有一個(gè)主鍵,用于聚簇索引,如果表沒(méi)有定義主鍵會(huì)選擇第一個(gè)非Null的唯一索引作為主鍵,如果還沒(méi)有,生成一個(gè)隱藏的DB_ROW_ID作為主鍵構(gòu)造聚簇索引。
  • DB_TRX_ID:最近更改該行數(shù)據(jù)的事務(wù)ID钥星。
  • DB_ROLL_PTR:undo log的指針,用于記錄之前歷史數(shù)據(jù)在undo log中的位置沾瓦。
  • DELETE BIT:索引刪除標(biāo)志,如果DB刪除了一條數(shù)據(jù),是優(yōu)先通知索引將該標(biāo)志位設(shè)置為1,然后通過(guò)(purge)清除線程去異步刪除真實(shí)的數(shù)據(jù)。


簡(jiǎn)化過(guò)程

不需要實(shí)時(shí)以同步的方式刷盤(pán)谦炒,數(shù)據(jù)可以后臺(tái)異步寫(xiě)入磁盤(pán)(根據(jù) innodb_flush_log_at_trx_commit參數(shù)值0,1,2來(lái)決定)
redo log寫(xiě)入磁盤(pán)是順序IO
undo log也寫(xiě)入到redo log中

redo 緩存刷盤(pán)規(guī)則:

  • 事務(wù)提交時(shí)
  • 當(dāng)log buffer 中一半的內(nèi)存空間已經(jīng)被使用時(shí)
  • log checkpoint時(shí)

check point
check point機(jī)制是為了減少實(shí)例恢復(fù)的時(shí)間(如果在某個(gè)時(shí)間點(diǎn)贯莺,臟頁(yè)的數(shù)據(jù)被刷新到了磁盤(pán),系統(tǒng)就把這個(gè)刷新的時(shí)間點(diǎn)記錄到redo log的結(jié)尾位置宁改,在進(jìn)行恢復(fù)數(shù)據(jù)的時(shí)候缕探,checkpoint時(shí)間點(diǎn)之前的數(shù)據(jù)就不需要進(jìn)行恢復(fù)了,可以縮短時(shí)間)

  • 緩沖池不夠用時(shí)还蹲,觸發(fā)checkpoint爹耗,將臟頁(yè)刷盤(pán)
  • 重做日志不夠用時(shí),刷新磁盤(pán)

臟頁(yè):一般業(yè)務(wù)運(yùn)行過(guò)程中谜喊,當(dāng)業(yè)務(wù)需要對(duì)某張的某行數(shù)據(jù)進(jìn)行修改的時(shí)候潭兽,innodb會(huì)先將該數(shù)據(jù)從磁盤(pán)讀取到緩存中去,然后在緩存中對(duì)這條數(shù)據(jù)進(jìn)行修改锅论,這樣緩存中的數(shù)據(jù)就和磁盤(pán)的數(shù)據(jù)不一致了,這個(gè)時(shí)候緩存中的數(shù)據(jù)就稱(chēng)為dirty page楣号,只有當(dāng)臟頁(yè)統(tǒng)一刷新到磁盤(pán)中才會(huì)是clean page

在COMMIT的時(shí)候最易,InnoDB不會(huì)將dirty data page寫(xiě)盤(pán)怒坯。之所以強(qiáng)調(diào)這個(gè)是因?yàn)椋苋菀鬃屓讼氲皆謇粒峤桓淖兙褪菍⑺袞|西寫(xiě)到一個(gè)持久媒介上剔猿。
其實(shí),commit時(shí)只有l(wèi)og記錄需要寫(xiě)嬉荆。寫(xiě)dirty data page只可能發(fā)生在overflow或checkpoint時(shí)刻归敬,因?yàn)樗鼈兊膬?nèi)容是多余的。

參考內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鄙早,一起剝皮案震驚了整個(gè)濱河市汪茧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌限番,老刑警劉巖舱污,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異弥虐,居然都是意外死亡扩灯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)霜瘪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珠插,“玉大人,你說(shuō)我怎么就攤上這事颖对∧沓牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惜互,是天一觀的道長(zhǎng)布讹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)训堆,這世上最難降的妖魔是什么描验? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮坑鱼,結(jié)果婚禮上膘流,老公的妹妹穿的比我還像新娘。我一直安慰自己鲁沥,他們只是感情好呼股,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著画恰,像睡著了一般彭谁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允扇,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天缠局,我揣著相機(jī)與錄音则奥,去河邊找鬼。 笑死狭园,一個(gè)胖子當(dāng)著我的面吹牛读处,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唱矛,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼罚舱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绎谦?” 一聲冷哼從身側(cè)響起管闷,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燥滑,沒(méi)想到半個(gè)月后渐北,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铭拧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赃蛛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀菩。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呕臂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肪跋,到底是詐尸還是另有隱情歧蒋,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布州既,位于F島的核電站谜洽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吴叶。R本人自食惡果不足惜阐虚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚌卤。 院中可真熱鬧实束,春花似錦、人聲如沸逊彭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侮叮。三九已至避矢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背审胸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工分尸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歹嘹。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像孔庭,于是被迫代替她去往敵國(guó)和親尺上。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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