MySQL之InnoDB中的redo日志類型詳解
1、背景
執(zhí)行我們的sql語(yǔ)句是在Buffer Pool中操作的,因?yàn)樗⑿碌酱疟P(pán)慢的原因可能不會(huì)立即同步到磁盤(pán),當(dāng)系統(tǒng)崩潰時(shí),肯定不能讓我們的操作丟失,但是Buffer Pool中的臟頁(yè)還未同步到磁盤(pán),所以就要把操作Buffer Pool的這一過(guò)程更輕量的記錄下來(lái)并寫(xiě)的磁盤(pán),記錄下來(lái)的內(nèi)容就叫redo日志。
2、redo日志
【1】格式
redo日志的類型有很多種,每條日志的前面部分都是相同的,其通用結(jié)構(gòu)如下如圖所示:

字段含義如下:
| 字段 | 含義 |
|---|---|
| type | redo日志類型 |
| space ID | 表空間ID |
| page number | 頁(yè)號(hào) |
| data | redo日志的具體內(nèi)容 |
【2】類型
redo日志類型常見(jiàn)的有如下幾種:
| 字段 | 十進(jìn)制數(shù) | 含義 |
|---|---|---|
| MLOG_1BYTE | 1 | 在頁(yè)面的某個(gè)偏移量處寫(xiě)入1個(gè)字節(jié)的redo日志類型 |
| MLOG_2BYTE | 2 | 在頁(yè)面的某個(gè)偏移量處寫(xiě)入2個(gè)字節(jié)的redo日志類型 |
| MLOG_4BYTE | 4 | 在頁(yè)面的某個(gè)偏移量處寫(xiě)入4個(gè)字節(jié)的redo日志類型 |
| MLOG_8BYTE | 8 | 在頁(yè)面的某個(gè)偏移量處寫(xiě)入8個(gè)字節(jié)的redo日志類型 |
| MLOG_WRITE_STRING | 30 | 在頁(yè)面的某個(gè)偏移量處寫(xiě)入一串?dāng)?shù)據(jù)的redo日志類型 |
| MLOG_REC_INSERT | 9 | 插入一條使用非緊湊行格式記錄的redo日志類型 |
| MLOG_COMP_REC_INSERT | 38 | 插入一條使用緊湊行格式記錄的redo日志類型 |
| MLOG_COMP_PAGE_CREATE | 58 | 創(chuàng)建一個(gè)存儲(chǔ)緊湊行格式記錄的頁(yè)面的redo日志類型 |
| MLOG_COMP_REC_DELETE | 42 | 刪除一條使用緊湊行格式記錄的redo日志類型 |
| MLOG_COMP_LIST_START_DELETE | 44 | 刪除一系列使用緊湊行格式記錄的開(kāi)頭redo日志類型 |
| MLOG_COMP_LIST_END_DELETE | 43 | 刪除一系列緊湊行格式記錄的結(jié)尾redo日志類型 |
| MLOG_ZIP_PAGE_COMPRESS | 51 | 壓縮一個(gè)數(shù)據(jù)頁(yè)的redo日志類型 |
| MLOG_MULTI_REC_END | 31 | 代表一組redo日志中的最后一條redo日志類型 |
接下來(lái)就大概講一下幾種redo日志類型結(jié)構(gòu), MLOG_1BYTE、 MLOG_2BYTE、 MLOG_4BYTE、 MLOG_8BYTE的結(jié)果如下:

MLOG_WRITE_STRING類型結(jié)構(gòu)如下:

MLOG_COMP_REC_INSERT類型結(jié)構(gòu)如下:

【3】組
像事務(wù)一樣,有的場(chǎng)景一組redo日志也具有原子性的特性,所以就有MLOG_MULTI_REC_END類型的redo日志來(lái)表示一組redo日志的最后一條,為了區(qū)分redo日志到底是單一的還是屬于某個(gè)組的,就將redo日志結(jié)構(gòu)中的type字段8字節(jié)分為前面1字節(jié)和后面7字節(jié),前面1字節(jié)為1就代表單一的redo日志,否則就為某個(gè)組的redo日志,后面7個(gè)字節(jié)用來(lái)表示redo日志類型。
【4】Mini-Transaction
訪問(wèn)一組redo日志的過(guò)程叫做Mini-Transaction,一個(gè)事務(wù)可以包含多個(gè)語(yǔ)句,一個(gè)語(yǔ)句可以包含多個(gè)Mini-Transaction,一個(gè)Mini-Transaction包含多個(gè)redo日志,這就是它們之間的關(guān)系。
3、總結(jié)
本文主要簡(jiǎn)單介紹了一下redo日志有哪幾種類型,還有一些其它的類型可以在網(wǎng)上大概查找了解一下。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL使用ReplicationConnection導(dǎo)致連接失效解決
這篇文章主要為大家介紹了MySQL使用ReplicationConnection導(dǎo)致連接失效問(wèn)題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
MySQL的一級(jí)索引和二級(jí)索引的區(qū)別及說(shuō)明
這篇文章主要介紹了MySQL的一級(jí)索引和二級(jí)索引的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
mysql導(dǎo)入sql文件報(bào)錯(cuò) ERROR 2013 2006 2002
今天在做項(xiàng)目的時(shí)候遇到個(gè)問(wèn)題,就是往mysql里導(dǎo)入sql文件的時(shí)候總是報(bào)ERROR 2013 2006 2002,研究了一番才找到解決辦法,這里記錄下來(lái)分享給大家2014-11-11
mysql中取系統(tǒng)當(dāng)前時(shí)間,當(dāng)前日期方便查詢判定的代碼
今天在寫(xiě)一段查詢語(yǔ)句的時(shí)候,需要判定結(jié)束日期是不是大于當(dāng)前日期,一般情況下都是通過(guò)php判定日期,然后查詢。2011-12-12
MySQL提示The InnoDB feature is disabled需要開(kāi)啟InnoDB的解決方法
這篇文章主要介紹了MySQL提示The InnoDB feature is disabled需要開(kāi)啟InnoDB的解決方法,簡(jiǎn)單分析了MySQL數(shù)據(jù)庫(kù)開(kāi)啟InnoDB引擎的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01
MySQL?存儲(chǔ)引擎InnoDB最佳實(shí)踐

