概述

任何对Innodb表的更新,Innodb都会将更新操作转化为WAL(write ahead log)并写入日志文件,WAL中记录了修改的详细信息。WAL日志在事务提交时会保证被写入持久化存储设备以保证事务的可靠性,WAL技术是保证数据库可靠存储以及提升性能的最重要手段。本文将详细描述WAL日志在磁盘上的物理组织格式。

WAL文件

MySQL WAL日志是一组日志文件集合,它们在数据库实例创建时预创建,并在数据库运行中被循环使用。WAL文件大小和数目可以通过参数设置,见innodb_log_file_size 和 innodb_log_files_in_group 。

日志文件

每个WAL文件的前2048字节存放文件头信息。文件头后面是WAL内容,按照BLOCK为单位分割,BLOCK大小默认为512字节。日志文件布局如下图所示:

其中几个重要的字段:

日志文件头共占用4个OS_FILE_LOG_BLOCK_SIZE的大小,即2048,有以下字段:

LOG_GROUP_ID:该log文件所属的日志组,占用4个字节,当前均为0;

LOG_FILE_START_LSN: 该log文件记录的开始日志的lsn,占用8字节;

LOG_FILE_WAS_CRATED_BY_HOT_BACKUP 备份程序所占用的字节数,共占用32字节

LOG_CHECKPOINT_1/LOG_CHECKPOINT_2 两个记录InnoDB checkpoint信息的字段,分别从文件头的第二个和第四个block开始记录,只使用日志文件组的第一个日志文件。 从地址2KB偏移量开始,其后就是顺序写入的各个日志块(log block)。

日志块结构

所有WAL是以日志块为单位组织在日志文件中,日志块默认为512字节。所有的日志以块为单位顺序写入文件。每一条记录都有自己的LSN(log sequence number, 表示从日志记录创建开始到特定的日志记录已经写入的字节数)。每个日志块包含一个日志头(12字节)、一个尾部(4字节,主要是Block内容的crc校验),以及一组日志记录(最多512 – 12 – 4 = 496字节) 。

日志块头包含以下几个字段:

block_number:4B,表示这是第几个block块。 可通过LSN计算: log_block_convert_lsn_to_no

block_data_len:2B,表示该block中已经写入的字节数,若是整个块都写满了的话,该值是 512

first_rec_offset:2B,表示该block中第一个全新的log record的开始log record的偏移量

log_record_data:496B,存放真正的redo日志内容

checksum:4B,此block数据校验和,用于正确性校验

这里需要特别解释的是first_rec_offset字段:在innodb事务层产生的wal日志其实是被组织成为一条条的log record,每个record都有特定的类型以及相应的内容。当log record被存储至日志文件中时,可能会出现一个log record跨Block存储的情况,因而需要在Block Header中存储first_rec_offset来代表该Block中第一个起始log record在该Block内的偏移,需要注意的是:first_rec_offset包含Block Header的大小。如下例:

该例中,MLOG_RENAME该log record跨了两个Block,其中8B落在了第二个Block,于是第二个Block的Block Header字段中的first_rec_offset值为12 + 8 = 20。

存在两种特殊情况:1. Block中的紧接着Header的就是一个新log record的起始字节,那么first_rec_offset便是Block Header Size,即12;2. 若Block内的所有有效数据存储的都是上一个Block内最后一个log record的内容,那么first_rec_offset便为0。

LSN和文件偏移量之间转换

在Innodb中LSN是一个非常重要的概念,表示某个log record从日志记录创建开始已经写入的字节数。LSN的计算是包含BLOCK的头和尾字段的。

那如何由一个给定LSN的日志,在日志文件中找到它存储的位置(文件以及在文件内的偏移)是一个比较有意思的问题,原理也比较简单,感兴趣的朋友可以研究下函数log_files_real_offset_for_lsn,这里便不再赘述。

mysql wal_MySQL · 引擎特性 · Innodb WAL物理格式相关推荐

  1. MySQL · 引擎特性 · InnoDB 事务子系统介绍

    前言 在前面几期关于InnoDB Redo和Undo实现的铺垫后,本节我们从上层的角度来阐述InnoDB的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块,如何实现MVCC及ACID ...

  2. MySQL · 引擎特性 · InnoDB 事务系统

    MySQL · 引擎特性 · InnoDB 事务系统 前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍Inn ...

  3. MySQL · 引擎特性 · InnoDB 崩溃恢复过程

    在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主要流程. 本文代码分析基于 MySQL 5.7.7-RC ...

  4. MySQL存储引擎(InnoDB引擎)

    本篇章主要介绍什么是 MySQL 存储引擎?常用的 MySQL 存储引擎有哪些?以及详细介绍一下目前应用最广泛的 InnoDB 存储引擎,包括其:逻辑存储结构.架构.事务原理.MVCC等. 一.初识  ...

  5. MySQL存储引擎及InnoDB并发控制介绍

    MySQL存储引擎采用了可插拔的结构,即用户可以根据自己的需要来选择不同的存储引擎. 下表是MySQL不同的存储引擎的不同的特性: Feature<?xml:namespace prefix = ...

  6. MySql存储引擎特性对比

    下表显示了各种存储引擎的特性: 其中最常见的两种存储引擎是MyISAM和InnoDB 刚接触MySQL的时候可能会有些惊讶,竟然有不支持事务的存储引擎,学过关系型数据库理论的人都知道,事务是关系型数据 ...

  7. mysql存储引擎中INNODB和MyISAM的区别

    切记:存储引擎是基于表的,而不是数据库. 存储引擎概念: MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不 ...

  8. MySQL 8新特性--InnoDB相关新特性

    文章目录 6.1. auto-increment 6.2.innodb_deadlock_detect 6.3. INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 6. ...

  9. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)

    一.MySQL的体系结构 1.连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全方案.服务器也会为安全接入的每个客户端验证它所具有的操作权限. 2.服务层:第二成 ...

最新文章

  1. vsftpd设置与使用总结
  2. 使用栈Stack实现队列Queue
  3. Activiti之H2
  4. Leetcode刷题(3)整数反转
  5. linux错误自动报告工具,linux – 关闭abrt的电子邮件通知(自动错误报告工具)
  6. 手把手带你搭建redis集群
  7. 用来向登录页面输出验证码图片的一般处理程序页面
  8. 【面经系列】八位硕博大佬的百度之旅
  9. 新手入门 哪个视频剪辑软件好用
  10. 手机企业邮箱客户端哪个好用?
  11. 去除百度推广等广告的插件神器
  12. TCP粘包问题以及解决方法
  13. 唯美烟花特效登录页面,我感觉自己又行了
  14. 概率论与数理逻辑————习题总结
  15. office更新失败,无法打开
  16. 华为hcip认证费用和报名资格
  17. 自动控制原理_卢京潮_根轨迹法(复域分析)_学习笔记
  18. JSTL中taglib uri=prefix=的使用
  19. vb6.0+vc6.0 写变速齿轮 HOOK timeGetTime
  20. 20 时序图图形含义

热门文章

  1. 计算前缀表达式与后缀表达式
  2. 电子表整点报时怎么取消_不用睁眼,让手机自动为你报时
  3. OSChina 周二乱弹 ——二哥是这样的2016
  4. python大数快速判断质数与分解质因数
  5. jsx中文是什么牌子口红_jsx中文是什么牌子口红_cl口红是什么牌子 cl口红中文名字...
  6. Cisco Smart Install远程命令执行漏洞
  7. 防抖和节流,有什么区别?
  8. C++编程之模板与泛型
  9. OpenCV—python 发票印章去除或分割(图像内容识别预处理)
  10. Ubuntu 18下OpenCV3.4的安装与使用示例