MySQL innodb引擎架构分析-Redo log

系列文章目录


1. MySQL innodb引擎架构分析-Buffer Pool
2. MySQL innodb引擎架构分析-Redo log
3. MySQL innodb引擎架构分析- Double Write Buffer
4.MySQL innodb引擎架构分析-Change Buffer


前言

在MySQL的事物处理过程中,数据库要保证事务的特性(关于数据库事务特性,可以参看我的这篇博文数据库的事务管理与三级封锁协议),其中要实现事务持久性的特点,在事务发生时,实时改变磁盘上的数据是最容易实现的,但这样实现存在以下几个问题:

  1. 因为 Innodb 是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了。
  2. 一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机 IO 写入性能太差。
  3. 一个事务并不是百分百提交的,也可能回滚,如果在执行完随机IO后不是提交事务而是回滚,白白浪费了磁盘IO,每次随机IO可能包含磁盘寻面、寻道、查扇区的过程,如果开辟一个磁盘空间,使其物理地址是连续的,把每次的记录都记录在这个区域,这样每次磁盘只在前一个数据后面追加就可以了,减少了磁盘寻面、寻道的次数,只在一个个连续的扇区写入数据即可。磁盘IO是非常宝贵的资源,不能轻易浪费。

因此 MySQL 设计了 Redo log ,具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题了,而相对而言Redo log所存在的区域是一个磁盘物理空间连续的,是一个顺序IO。

一、Redo log是什么?

Redo log是InnoDB引擎特有的。记录着事务里对数据的修改。在mysql中,如果修改了数据,那么事务提交前,首先会被记录成redo log日志写入磁盘,等到事务提交时,再把新数据写入磁盘。
在这里插入图片描述

二、Redo log是怎么工作的

Redo log的组成

Redo log 包括两部分:一个是内存中的日志缓冲(Redo log buffer),另一个是磁盘上的日志文件(Redo log file)。MySQL 每执行一条 语句,先将记录写入 Redo log buffer ,后续某个时间点再一次性将多个操作记录写到 Redo log file 。
Redo log记录物理日志,记录的是“在某个数据页上做了什么修改”,例如下面的语句 :
update table set a = 1 where id = 1;
那么翻译成物理日志类似于这样 :
把第10表空间的第90号页面的偏移量为1024处的值更新为1
下面是大部分类型的redo log的通用结构:
在这里插入图片描述

  • type:redo log的类型,目前redo log的类型很多
    MLOG_1BYTE:type字段对应的十进制为1,表示在页面的某个偏移量处写入一个字节
    MLOG_2BYTES:type字段对应的十进制为2,表示在页面的某个偏移量处写入两个字节
    MLOG_4BYTES:type字段对应的十进制为4,表示在页面的某个偏移量处写入四个字节
    MLOG_8BYTES:type字段对应的十进制为8,表示在页面的某个偏移量处写入八个字节
    MLOG_WRITE_STRING::type字段对应的十进制为30,表示在页面的某个偏移量处写入一串数据
  • Space ID:表空间ID
  • page number:页号
  • data:一条redo log的内容

Redo log的配置

默认情况下,Redo log 在磁盘上由名为 ib_logfile0 和 ib_logfile1 的两个物理文件展示。Redo log 相关参数简单介绍如下:

  • innodb_log_files_in_group:redo log文件的个数,命名方式如:ib_logfile0,iblogfile1… iblogfilen。默认2个,最大100个。
  • innodb_log_file_size:单个 redo log 文件设置大小,默认值为 48M,最大值为512G,注意最大值指的是整个redo log 系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。
  • innodb_log_group_home_dir:指定 redo log 文件组所在的路径,默认./ ,表示在数据库的数据目录下。
  • innodb_log_buffer_size:redo log buffer大小,默认16M。延迟事务日志写入磁盘,把 redo log 放到该缓冲区,然后根据innodb_flush_log_at_trx_commit 参数的设置,再把日志从 buffer 中 flush 到磁盘中。
  • innodb_flush_log_at_trx_commit:控制 redo log 刷新到磁盘的策略,默认为1。
    设置为0的时候,表示每次事务提交时不进行刷盘操作,如果是数据库挂掉,会丢失挂掉时到上一次刷盘的记录。
    设置为1的时候,表示每次事务提交时都将进行刷盘操作(默认值)
    设置为2的时候,表示每次事务提交时都只把redo log buffer内容写入操作系统的page cache,如果只是数据可挂掉,操作系统正常,提交的事物是不会丢失的。

Redo log何时刷盘

根据innodb_flush_log_at_trx_commit设置的参数不同,数据库会在以下时机进行Redo log 刷盘:

  1. 后台线程刷。
  2. 脏页太多,innodb存储引擎强制进行Checkpoint。使得部分redo文件可以被重写。当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,若此页为脏页,那么就需要强制执行checkpiont,将脏页也就是页的新版本刷回磁盘
  3. 事务提交时。脏页可以不写,但是redo log在提交前必须写!
  4. 正常关闭服务器。

总结

更改 redo log 及其 buffer 大小是需要重启数据库实例的,建议初始化时做好评估。可以适当加大 redo log 组数和大小,特别是你的数据库实例更新比较频繁的情况下。但也不推荐 redo log 设置过大。

猜你喜欢

转载自blog.csdn.net/ren365880/article/details/128269987
今日推荐