1、背景
执行我们的sql语句是在buffer pool中操作的,因为刷新到磁盘慢的原因可能不会立即同步到磁盘,当系统崩溃时,肯定不能让我们的操作丢失,但是buffer pool中的脏页还未同步到磁盘,所以就要把操作buffer pool的这一过程更轻量的记录下来并写的磁盘,记录下来的内容就叫redo日志。
2、redo日志
【1】格式
redo日志的类型有很多种,每条日志的前面部分都是相同的,其通用结构如下如图所示:
字段含义如下:
字段 | 含义 |
---|---|
type | redo日志类型 |
space id | 表空间id |
page number | 页号 |
data | redo日志的具体内容 |
【2】类型
redo日志类型常见的有如下几种:
字段 | 十进制数 | 含义 |
---|---|---|
mlog_1byte | 1 | 在页面的某个偏移量处写入1个字节的redo日志类型 |
mlog_2byte | 2 | 在页面的某个偏移量处写入2个字节的redo日志类型 |
mlog_4byte | 4 | 在页面的某个偏移量处写入4个字节的redo日志类型 |
mlog_8byte | 8 | 在页面的某个偏移量处写入8个字节的redo日志类型 |
mlog_write_string | 30 | 在页面的某个偏移量处写入一串数据的redo日志类型 |
mlog_rec_insert | 9 | 插入一条使用非紧凑行格式记录的redo日志类型 |
mlog_comp_rec_insert | 38 | 插入一条使用紧凑行格式记录的redo日志类型 |
mlog_comp_page_create | 58 | 创建一个存储紧凑行格式记录的页面的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 | 压缩一个数据页的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日志的最后一条,为了区分redo日志到底是单一的还是属于某个组的,就将redo日志结构中的type字段8字节分为前面1字节和后面7字节,前面1字节为1就代表单一的redo日志,否则就为某个组的redo日志,后面7个字节用来表示redo日志类型。
【4】mini-transaction
访问一组redo日志的过程叫做mini-transaction,一个事务可以包含多个语句,一个语句可以包含多个mini-transaction,一个mini-transaction包含多个redo日志,这就是它们之间的关系。
3、总结
本文主要简单介绍了一下redo日志有哪几种类型,还有一些其它的类型可以在网上大概查找了解一下。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论