这篇文章转载至http://rdc.taobao.com/blog/dba/html/317_innodb-dirty-page-redo-log.html

在InnoDB中,buffer pool里面的dirty page一方面可以加快数据处理速度,同时也会造成数据的不一致(RAM vs DISK)。本文介绍了dirty page是如何产生,以及InnoDB如何利用redo log如何消除dirty page产生的数据不一致。
  1. 当事务(Transaction)需要修改某条记录(row)时,InnoDB需要将该数据所在的page从disk读到buffer pool中,事务提交后,InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk中的不一样了,我们称buffer pool中的page为dirty page。Dirty page等待flush到disk上。
  2. dirty page既然是在Buffer pool中,那么如果系统突然断电Dirty page中的数据修改是否会丢失?这个担心是很有必要的,例如如果一个用户完成一个操作(数据库完成了一个事务,page已经在buffer pool中修改,但dirty page尚未flush),这时系统断电,buffer pool数据全部消失。那么,这个用户完成的操作(导致的数据库修改)是否会丢失呢?答案是不会(innodb_flush_log_at_trx_commit=1)。这就是redo log要做的事情,在disk上记录更新。
  3. redo log在每次事务commit的时候,就立刻将事务更改操作记录到redo log。所以即使buffer pool中的dirty page在断电时丢失,InnoDB在启动时,仍然会根据redo log中的记录完成数据恢复。
  4. redo log的另一个作用是,通过延迟dirty page的flush最小化磁盘的random writes。(redo log会合并一段时间内TRX对某个page的修改)
  5. 正常情况下,dirty page什么时候flush到disk上?
    1).redo log是一个环(ring)结构,当redo空间占满时,将会将部分dirty page flush到disk上,然后释放部分redo log。这种情况可以通过Innodb_log_wait(SHOW GLOBAL STATUS)观察,情况发生该计数器会自增一次。
    2).当需要在Buffer pool分配一个page,但是已经满了,并且所有的page都是dirty的(否则可以释放不dirty的page),通常是不会发生的。这时候必须flush dirty pages to disk。这种情况将会记录到Innodb_buffer_pool_wait_free中。一般地,可以可以通过启动参数innodb_max_dirty_pages_pct控制这种情况,当buffer pool中的dirty page到达这个比例的时候,将会强制设定一个checkpoint,并把dirty page flush到disk中。
    3).检测到系统空闲的时候,会flush,每次64 pages。
  6. 涉及的InnoDB配置参数:innodb_flush_log_at_trx_commit、innodb_max_dirty_pages_pct;状态参数:Innodb_log_wait、Innodb_buffer_pool_wait_free。
参考文献
  1. http://mysqldump.azundris.com/archives/78-Configuring-InnoDB-An-InnoDB-tutorial.html
  2. http://dev.mysql.com/doc/refman/5.0/en/innodb.html

转载于:https://blog.51cto.com/slevin/305137

InnoDB之Dirty Page、Redo log相关推荐

  1. InnoDB磁盘架构之redo log

    文章目录 1 问题背景 2 回顾 3 redo log 1 问题背景 前面研究了InnoDB磁盘架构之双写缓冲区,今天来研究InnoDB的redo log. 2 回顾 InnoDB架构如下图所示: 3 ...

  2. InnoDB之redo log写入和恢复

    1. 前言 InnoDB使用Buffer Pool来加速数据读写,提升性能的同时也带来了一些问题,为了避免页面频繁刷盘和磁盘随机写,InnoDB引入了WAL机制,先顺序写少量的redo log,再由后 ...

  3. 精讲 MySQL 事务日志:redo log 和 undo log

    来源:https://blog.csdn.net/demonson/article/details/104369733 innodb事务日志包括redo log和undo log.redo log是重 ...

  4. 【图文详解】MySQL事务日志 Redo log(重做) 和 Undo log(撤销)

    InnoDB Architecture https://dev.mysql.com/doc/refman/5.6/en/innodb-architecture.html 我们都知道数据库有四大属性AC ...

  5. Mysql redo log 漫游

    作者 | 曹金霖 杏仁Java工程师,正在锻炼自制力的朴素程序猿. redo log -> 物理日志 redo log 通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎 ...

  6. mysql重做日志与binlog日志区别_MySQL日志之binlog、redo log、undo log

    1. binlog(二进制日志) 1.1 binlog介绍 binlog记录了对数据库执行更改的所有操作(不包括查询),还包括了执行数据库更改操作的时间和执行时间等信息.binlog主要有两个作用:恢 ...

  7. 聊聊redo log是什么?

    前言 说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志),另一个是MySQL Servce层的 binlog(归档日志). 只要是数据更新操作,就一定会涉及 ...

  8. 关于redo log 刷盘时机

    InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略: 0 :设置为 0 的时候,表示每次事务提交时不进行刷 ...

  9. mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)

    前言 InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性. 和大多数关系型数据库一样, ...

最新文章

  1. 使用Windows Live Writer发布日志
  2. [HDU5828]Rikka with Sequence
  3. Linux 内核抓包功能实现基础(四) 手动查找邻居缓存填充MAC地址
  4. Frighting的日常:第6天
  5. 猛增 110K Star!年增长数最多的 10 大顶级前端学习资源项目!
  6. java final的内存_Java并发编程之final域的内存语义
  7. exists sql用法_干货!SQL性能优化,书写高质量SQL语句
  8. 自定义曲线_Qt编写的项目作品17-自定义曲线图柱状图
  9. 大数据面试求职经验总结
  10. 银行IT部门科技管理流程管控工作发展之路
  11. layer弹出框,zIndex不断增加的问题
  12. 用酷狗播放音乐时,会显示在msn的头像旁边
  13. 【资损】系统迭代过程中的兼容性设计
  14. 【翻译】理解 LSTM 网络
  15. 微生活时光机:去项目中挖掘JS模块化简史
  16. css 排版_Web排版的未来:CSS字体4级
  17. 《学习之道》第六章一心多用
  18. python极坐标绘图_Python 画极坐标图
  19. 【模电仿真】RC桥式正弦波发生电路
  20. ffmpeg自定义编解码器

热门文章

  1. VMware vsphere中虚拟机的基本操作方法
  2. 华为RH2285H V2设备管理口白屏的解决方法
  3. jmeter脚本写个小demo(html论坛自动发帖、json龙果学院-前后端分离)
  4. activiti前端画图转化_用于Activiti前端显示流程图的插件
  5. springboot做网站_SpringBoot项目实战(3):整合Freemark模板
  6. 大学生学java要去培训机构吗?
  7. python 读取日志文件_如何在Python中跟踪日志文件?
  8. 华为鸿蒙系统发展时间2021年,耗时八年打造国产系统,华为鸿蒙OS质疑声不断,它才是真正未来...
  9. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?
  10. linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比