2023-04-24 mysql-InnoDB redo log
2023-09-27 14:25:42 时间
前言
InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性。
和大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的WAL,即在持久化数据文件前,保证之前的redo日志已经写到磁盘。
LSN(log sequence number) 用于记录日志序号,它是一个不断递增的 unsigned long long 类型整数。在 InnoDB 的日志系统中,LSN 无处不在,它既用于表示修改脏页时的日志序号,也用于记录checkpoint,通过LSN,可以具体的定位到其在redo log文件中的位置。
为了管理脏页,在 Buffer Pool 的每个instance上都维持了一个flush list,flush list 上的 page 按照修改这些 page 的LSN号进行排序。因此定期做redo checkpoint点时,选择的 LSN 总是所有 bp instance 的 flush list 上最老的那个page(拥有最小的LSN)。由于采用WAL的策略,每次事务提交时需要持久化 redo log 才能保证事务不丢。而延迟刷脏页则起到了合并多次修改的效果,避免频繁写数据文件造成的性能问题。
由于 InnoDB 日志组的特性已经被废弃(redo日志写多份),归档日志(InnoDB archive log)特性也在5.7被彻底移除,本文在描述相关逻辑时会忽略这些逻辑。另外限于篇幅,InnoDB崩溃恢复的逻辑将在下期讲述,本文重点阐述redo log 产生的生命周期以及MySQL 5.7的一些改进点。
本文的分析基
相关文章
- configure: error: mysql configure failed. Please check config.log for more information.
- 【MySQL高级】MySql中常用工具及Mysql 日志
- MySQL事务四个特性 - 事务的四个隔离级别
- 8种MySQL常见SQL错误用法,我全中!
- MySQL三种日志之binlog/redo log/undo log
- MySQL 命令行导出、导入Select 查询结果
- 《PHP和MySQL Web开发从新手到高手(第5版)》一一1.5 向虚拟主机询问什么
- mysql当查询某字段结果为空并赋值
- mysql表名忽略大小写
- MySQL 时间类型 date、datetime 和 timestamp 的用法与区别
- mysql 实战 or、in与union all 的查询效率
- MySQL数据库:参数优化
- mysql中count与null的坑
- mysql拆分逗号一列变多行
- 【转】mysql的group_concat函数,默认最大长度是1024
- 为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数
- 修改mysql密码
- mysql性能优化-慢查询分析、优化索引和配置
- Navicat快速将mysql表转为postgresql表(数据+表结构)
- MySQL - 索引优化