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

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

MLOG_WRITE_STRING類型結構如下:

MLOG_COMP_REC_INSERT類型結構如下:

【3】組
像事務一樣,有的場景一組redo日志也具有原子性的特性,所以就有MLOG_MULTI_REC_END類型的redo日志來表示一組redo日志的最后一條,為了區(qū)分redo日志到底是單一的還是屬于某個組的,就將redo日志結構中的type字段8字節(jié)分為前面1字節(jié)和后面7字節(jié),前面1字節(jié)為1就代表單一的redo日志,否則就為某個組的redo日志,后面7個字節(jié)用來表示redo日志類型。
【4】Mini-Transaction
訪問一組redo日志的過程叫做Mini-Transaction,一個事務可以包含多個語句,一個語句可以包含多個Mini-Transaction,一個Mini-Transaction包含多個redo日志,這就是它們之間的關系。
3、總結
本文主要簡單介紹了一下redo日志有哪幾種類型,還有一些其它的類型可以在網(wǎng)上大概查找了解一下。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

