【什么是物理日志?】
在对页面的修改是极其简单的情况下(下面会有例子),redo日志中只需要记录一下在某个页面的某个偏移量处修改了几个字节的值、具体修改后的内容是啥就好了。
【场景举例】
- 如果某张表没有主键,并且没有定义不允许存储NULL值的UNIQUE键,那么InnoDB会自动为表添加一个名为row_id的隐藏列作为主键。
- 为这个row_id隐藏列进行赋值的方式如下:
- 内存中维护一个全局变量,当向某个包含row_id隐藏列的表中插入一条记录时,就会把这个全局变量的值当做新记录的row_id的值,并且把这个全局变量 1;
- 每当这个全局变量的值为256的倍数时,就会将该变量的值刷新到系统表空间页号为7的页面中一个名为Max Row Id的属性中。(这个写入操作,实际上是在Buffer Pool中完成的,我们需要把这次对这个页面的修改以redo日志的形式记录下来)
- 当系统启动时,会将这个Max Row Id属性加载到内存中,并将该值加上256之后赋值给前面提到的全局变量(因为在系统上次关机时,如果内存中的全局变量没有到达256的倍数,而没有刷新到BufferPool,那么就会出现该全局变量的值可能大于磁盘页面中Max Row ID属性的值)
- 这种对页面修改是极其简单的。所以该redo日志即为物理日志。
- 物理日志的几种不同类型
- MLOG_1BYTE(type=1)
表示在页面的某个偏移量处写入1字节的redo日志类型。
- MLOG_2BYTE(type=2)
表示在页面的某个偏移量处写入2字节的redo日志类型。
- MLOG_4BYTE(type=4)
表示在页面的某个偏移量处写入4字节的redo日志类型。
- MLOG_8BYTE(type=8)
表示在页面的某个偏移量处写入8字节的redo日志类型。由于Max Row ID占用8字节的空间,所以在修改页面中的这个属性时,会记录一条类型为MLOG_8BYTE的redo日志。如下图所示:
表示在页面的某个偏移量处写入一个字节序列。
【注】只要在【数据占用的字节数】处填入1、2、4、8这些数字,就可以分别替代MLOG_1BYTE、MLOG_2BYTE、MLOG_4BYTE、MLOG_8BYTE这些类型的redo日志。但是,为了节省空间,所以,才特殊定义了这4个类型。