《MySQL是怎样运行的》【第19章 redo日志】笔记--【redo日志特性、分类、写入、刷盘时间、日志文件组】【Mini-Transaction(MTR)】

第19章 redo日志

《MySQL是怎样运行的》【第19章 redo日志】笔记--【redo日志特性、分类、写入、刷盘时间、日志文件组】【Mini-Transaction(MTR)】_第1张图片

前导知识

  • 增删改查的本质都是访问页面(读写、创建新页面等)

  • 如果仅仅修改某个页面的一个字节,也需要将一个完整的页面从内存刷到磁盘中,这种情况刷新一个完整的数据页太浪费了

  • 一个事务修改的多个页面可能并不相邻。导致随机I/O增多

what

  • 没有必要在每次提交事务的时候就把该事务对应的修改页面全部刷新到磁盘,只要把修改记录下来就好

  • 依靠redo log,系统在崩溃重启后按照里面的内容重新更新数据页就能实现事务的持久性

  • redo日志本质上是在记录事务对数据库进行了什么修改,在之后系统因崩溃而重启后可以把事务进行的任何修改都恢复过来

特性

  • redo日志占用空间小

  • redo日志顺序写入磁盘

分类

简单类型

  • 事务对页面的修改极其简单,redo日志只需要记录在某个页面进行了什么改动就好,这种类型的redo日志也叫物理日志

复杂类型

  • 事务可能会修改很多页面(更新多个B+树),这种redo日志既是物理日志,也是逻辑日志
  • 物理:redo日志记录对哪个表空间的哪个页做了修改
    逻辑:系统崩溃重启时,并不能根据redo日志在要买呢某个偏移量直接恢复某个数据,而是需要调用一些函数,调用结束后才能恢复数据(因为涉及的页面太多)

Mini-Transaction(MTR)

what

  • 对底层页面进行一次原子访问的过程(如向某个索引对应的B+树插入一条记录,不能插一半就停了)

分级

  • 一个事务可包含若干语句,一条语句可包含若干MTR,一个MTR可包含若干redo日志

写入

redo log buffer

  • 写入redo日志不能直接写入到磁盘中。服务器在启动时向OS申请了一片连续内存空间作为redo log buffer
  • 同一个事务向log buffer中写入redo日志是顺序写入
  • 不同事务对应的redo日志可能是交替写入log buffer的
  • 向log buffer中写入redo日志并不是一条条写入,而是以MTR生成的一组redo日志为单位写入的

redo日志刷盘时间

what

  • MTR运行过程中产生的一组redo日志会在MTR结束时写入log buffer中,在一些特定实际会从log buffer中刷到磁盘上

when

  • log buffer空间不足
  • 事务提交
  • 后台有一个线程,以一定频率将log buffer中的redo日志刷到磁盘上
  • 正常关闭服务器
  • 做checkpoint

redo日志文件组

what

  • 磁盘上的redo日志文件不止一个,以日志文件组的形式出现
  • 采用循环的方式向日志文件组中写入数据

几个lsn

log sequence number(lsn)

  • redo日志量在不断增加,以lsn表示当前一共写入log buffer的redo日志量

flushed_to_disk_lsn

  • 表示刷新到磁盘中的redo日志量

checkpoint_lsn

  • 表示当前系统中可以被覆盖的redo日志总量
  • 假如页a被刷新到了磁盘上,所属的MTR生成的一组日志就可以被覆盖,可以进行增加checkpoint_lsn的操作,这个过程就是执行一次checkpoint

你可能感兴趣的:(#,MySQL是怎样运行的,mysql,数据库)