本文介绍了InnoDB的重做日志(Redo Log)类型。

物理日志(Physical logging)

物理日志是指在日志中保存一个页中发生改变的字节,是纯物理格式的日志,逐字节的记录数据的改动。比如[start,end,'xxxx']格式的内容改动。

  • 优点

    高效率,并且可以直接修改物理格式,任何操作都不需要重新遍历Btree到指定页面。

  • 缺点

    产生的日志量大。

    例如:一次DELETE操作,逻辑日志只需要记录MLOG_COMP_REC_DELETE offset,但实际执行过程中需要修改prev_ record->next_record、next_record->prev_record、checksum和PAGE_DIR_SLOT_MIN_N_OWNED,可能还需要更新dir slot等信息。如果使用物理日志,这些信息涉及到的内容在页面不同的位置,需要记录的日志非常多。

    除此之外,在页面整理或SMO场景中会记录大量的冗余日志。例如,当一个页面内部有大量的删除操作且有碎片需要整理时,需要重新组织页面结构。如果使用物理日志,需要将所有记录重新插入到当前页面,且需要重新记录offset。而逻辑日志只需要记录MLOG_PAGE_REORGANIZE。对于16 KB的页面来说,使用逻辑日志时,只需要记录几个字节。而物理日志则需要记录大约16 KB的内容。

逻辑日志(Logical Logging)

逻辑日志记录的是对于表的操作,类似于MySQL数据库上层产生的二进制日志(Binlog)。记录的是操作,与物理格式无关。

  • 优点

    记录非常高效。例如,DELETE操作只需要记录几个字节。在SMO和页面整理等场景更加明显。

  • 缺点

    因为逻辑日志记录的是record_id,那么所有改动均需要重新遍历Btree,且需要使用index lock串行修改逻辑。而物理日志因为页面之前完全没有依赖,可以并行回放,所以故障恢复效率最高。

物理逻辑日志(Physiological Logging)

大部分商业数据库选择物理逻辑日志,其设计思想为:“physical to a page, logical within a page”,即根据物理页记录日志,根据不同的逻辑操作类型写入日志。 InnoDB也一样,尽可能地将逻辑日志和物理日志的优点结合起来。

在InnoDB存储引擎中,每种重做日志有固定的头部格式,如下图所示:InnoDB可以看出redo_log_type定义了逻辑操作的类型,spacepage_no表示在哪个物理页产生的日志。因此,InnoDB存储引擎的所有重做日志都是物理逻辑日志。

InnoDB重做日志类型是逻辑操作类型,一些操作类型需要修改记录,会记录offset。且大量的操作是一些逻辑操作,如MLOG_1BYTE、MLOG_2BYTE和MLOG_INIT_FILE_PAGE等。

对于INSERTUPDATEDELETE等操作可以保证记录到页面级别,在故障恢复时,不需要重新执行Btree遍历找到页面就可以并行回放日志,从而加快故障恢复。

PolarDB针对当前InnoDB日志一些冗余的地方也做了改进。例如,增加了record长度信息,减少了连续mtr中的page id记录等。