MySQL——redo日志类型中的复杂日志

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL——redo日志类型中的复杂日志相关的知识,希望对你有一定的参考价值。

一、复杂日志类型概述

1、INSERT语句所涉及到的数据变动

  • 当我们执行一条INSERT语句涉及的更新内容的时候,其实并不是只是对用户数据进行了插入操作,底层其实涉及了很多,比如页数据的更新,分裂,数据迁移,甚至是,如果采用默认row_id来维护记录的唯一标识的话,还会涉及到MAX_ROW_ID的变动。INSERT语句所涉及到的数据变动。所下图所示表示:
  • 注:用户数据指的就是聚簇索引和二级索引对应的B+树。

2、INSERT语句所涉及到的更新内容

  • 可能更新Page Directory中的槽信息
  • 可能更新Page Header中的各种页面统计信息。
    (1)、PAGE_N_DIR_SLOTS:表示的槽数量可能会更改。
    (2)、PAGE_HEAP_TOP:代表的还未使用的空间最小地址可能会更改。
    (3)、PAGE_N_HEAP:代表的本页面中的记录数量可能会更改。
  • 可能更新记录的单向链表
    (1)、数据页中的记录按照序列从小到大的顺序组成的一个单向链表,每插入一条记录,还需要更新上一条记录的记录头信息中的next_record属性来维护这个单向链表。
  • 还有其他需要更新的内容

二、解决方案

1、概述

  • 以上说明的一点就是在把一条记录插入到一个页面时,需要更改的地方非常的多。这时,如果使用简单的物理redo日志来记录这些修改,可能会有如下两种解决方案;

2、解决方案一

  • 在每个修改的地方都记录一条redo日志

3、解决方案二

  • 将整个页面第一个被修改的字节到最后一个被修改的字节之间所有的数据当成一条物理redo日志中的具体内容
  • 这种方案所涉及的数据中,会掺杂很多本来没有被修改的数据,这样都加到redo日志中,浪费空间。

三、redo复杂日志类型

为了解决上面的问题,我们来介绍一下新的redo日志类型。

  • MLOG_REC_INSERT(type=9)
    表示插入一条使用非紧凑行格式(REDUNDANT)的记录时,redo日志的类型。

  • MLOG_COMP_REC_INSERT(type=38)
    表示插入一条使用紧凑行格式(COMPACT、DYNAMIC、COMPRESSED)的记录时,redo日志的类型。

  • MLOG_COMP_PAGE_CREATE(type=58)
    表示创建一个存储紧凑行格式记录的页面时,redo日志的类型。

  • MLOG_COMP_REC_DELETE(type=42)
    表示删除一条使用紧凑行格式的记录时,redo日志的类型。

  • MLOG_COMP_LIST_START_DELETE(type=44)
    表示在从某条给定记录开始删除页面中一系列使用紧凑行格式的记录时,redo日志的类型。

  • MLOG_COMP_LIST_END_DELETE(type=43)
    与MLOG_COMP_LIST_START_DELETE类型的redo日志相呼应,表示删除一系列记录,直到MLOG_COMP_LIST_END_DELETE类型的redo日志对应的记录为止。

  • MLOG_ZIP_PAGE_COMPRESS(type=51)
    表示压缩一个数据页时,redo日志的类型。

四、日志类型的解释

上面这些类型的redo日志包含两个层面的意思:

  • 从物理层面来看

    这些日志都指明了对哪个表空间的哪个页进行修改。

  • 从逻辑层面来看
    在系统崩溃后重启时,并不能直接根据这些日志中的记载,在页面内的某个偏移量处恢复某个数据,而是需要调用一些事先准备好的函数,在执行完这些函数后才可以将页面恢复成系统崩溃前的样子。

  • 是以MLOG_COMP_REC_INSERT类型的redo日志为例,解释物理层面和逻辑层面的含义。

以上是关于MySQL——redo日志类型中的复杂日志的主要内容,如果未能解决你的问题,请参考以下文章

MySQL——redo日志类型中的物理日志

浅析MySQL 8.0 redo log

数据库篇:mysql日志类型之 redo、undo、binlog

MySQL的redo logundo logbinlog

数据库篇:mysql日志类型之 redoundobinlog

MySQL日志