41、在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样?
昨天我们简单给大家回顾了一下在数据库里执行增删改操作的时候,redo log是用来干什么的,为什么需要这个东西,如果没有他会怎么样,有了他之后又能有什么样的效果,相比大家现在都对redo log这个东西有一定的理解了
那么接下来我们就要深入研究一下redo log的一些技术细节了,今天就来看看写入磁盘上的日志文件的redo log,大致长个什么样,里面都包含一些什么东西。
之前略微给大家提到过,就是redo log里本质上记录的就是在对某个表空间的某个数据页的某个偏移量的地方修改了几个字节的值,具体修改的值是什么,他里面需要记录的就是表空间号+数据页号+偏移量+修改几个直接的值+具体的值
所以根据你修改了数据页里的几个字节的值,redo log就划分为了不同的类型,MLOG_1BYTE类型的日志指的就是修改了1个字节的值,MLOG_2BYTE类型的日志指的就是修改了2个字节的值,以此类推,还有修改了4个字节的值的日志类型,修改了8个字节的值的日志类型。
当然,如果你要是一下子修改了一大串的值,类型就是MLOG_WRITE_STRING,就是代表你一下子在那个数据页的某个偏移量的位置插入或者修改了一大串的值
所以其实一条redo log看起来大致的结构如下所示:
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,具体修改的数据
大致就是一条redo log中一次排列上述的一些东西,这条redo log表达语义就很明确了,他的类型是什么,类型就告诉了你他这次增删改操作了多少字节的数据;
然后在哪个表空间里操作的,这个就是跟你SQL在哪个表里执行的是对应的;接着就是在这个表空间的哪个数据也里执行的,在数据页的哪个偏移量开始执行的,具体更新的数据是哪些呢。
有了上述信息,就可以精准完美的还原出来一次数据增删改操作做的变动了。
只不过如果是MLOG_WRITE_STRING类型的日志,因为不知道具体修改了多少字节的数据,所以其实会多一个修改数据长度,就告诉你他这次修改了多少字节的数据,如下所示他的格式:
日志类型(就是类似MLOG_1BYTE之类的),表空间ID,数据页号,数据页中的偏移量,修改数据长度,具体修改的数据
因此今天就简单给大家讲解一下redo log的日志的格式,其实没大家想的那么复杂,当然往深了说,那可能也比你想的复杂很多,比如redo log日志里面可能会记录你更新了哪些索引之类的,那就复杂去了,但是这些东西就等我们讲到索引那块的时候再说好了
现在大家对redo log日志的格式了解到这个程度其实就可以了,你脑子里应该更加清晰了一些,就是执行增删改的时候,在Buffer Pool里通过复杂的缓存页机制完成更新,然后就会以今天讲解的这种格式写入一天redo log日志记录本次修改