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,数据页号,数据页中的偏移量,修改数据长度,具体修改的数据