# 文章主题 #
1.理解内存数据落盘过程
2.掌握CheckPoint和Doublewrite机制
3.深度剖析事务ACID及隔离级别
4.掌握MVCC实现原理
脏页落盘
什么是脏页?
对数据的修改操作,首先修改内存结构中缓冲区中的页,缓冲区中的页与磁盘中的页数据不一致,所以称缓冲区中的页为脏页。
脏页如何进入到磁盘?
脏页从缓冲区刷新到磁盘,不是每次页更新之后触发,而是通过checkPoint机制刷新磁盘
InnoDB数据落盘流程
如何提升性能?
内存中写,操作过程记录日志,日志批量写入磁盘
分散写变顺序写
如何持久化数据?
通过CheckPoint机制进行脏页落盘日志先行,所有操作前先写Redo日志
数据安全性怎么保证?
Force Log at commit
Write Ahead Log(WAL)
CheckPoint机制
Double Write机制
为什么不是每次更新直接写入磁盘呢?
1. 随着写入操作增加性如果每次页发生变化就落盘,一个页落盘必然伴随4次10操作,性能开销很大,而且能开销是指数级增长
2. 当然,数据也不能在内存中保存太长时间,时间越久安全性风险越高
3. InnoDB采用Write Ahead Log策略和Force Log at commit机制实现事务的持久性
Write Ahead Log:日志先行,数据变更写入磁盘前,必须将内存中的日志写到磁盘
Force Log at commit:当事务提交时,所有事务产生的日志都必须刷到磁盘
怎么确保日志安全进入磁盘?
1. 为了确保日志写入到磁盘,将redo日志写入Log Buffer后调用fsync函数,将缓冲日志文件从0SCache中写入磁盘
2. 日志进入磁盘不仅要考虑安全性,还需兼顾性能!
Redo日志落盘
Redo日志默认落盘策略,事务提交立即落盘。Log Buffer写入磁盘的时机由参数
innodb_flush_log_at_trx_commit 控制,此参数控制每次事务提交时InnoDB的行为。
三个落盘策略配置:
为0时:每秒写入,与事务无关
最多丢失1秒的事务操作
写入效率最高,安全性最低
为1时:事务提交,写入磁盘
不会丢失数据
写入效率最低,安全性最高
为2时:事务提交,写入OS Buffer
数据安全性依赖于系统,最多丢1秒事务操作
写入效率居中,安全性居中
CheckPoint机制
什么是CheckPoint机制?
它是将缓冲池中的脏页数据刷到磁盘上的机制,决定脏页落盘的时机、条件和脏页的选择等
CheckPoint的类型不止一种
解决什么问题?
CheckPoint分类
sharp checkpoint:关闭数据库时将脏页全部刷新到磁盘中
fuzzy checkpoint:默认方式,在运行时选择不同时机将脏页刷盘,只刷新部分脏页
1. Master Thread checkpoint:固定频率刷新部分脏页到磁盘,异步操作不会阻塞用户线程
2. FLUSH_LRU_LIST checkpoint:缓冲池淘汰非热点Page,如果该Page是脏页会执行CheckPoint
3. Async/Sync Flush Checkpoint:redo日志不可用时,强制脏页落盘,有了前两个这种一般不会发生
4. Dirty Page too much checkpoint:脏页占比太多强制进行刷盘,阈值75%
Double Write机制
写失效问题
数据库准备刷新脏页时,将16KB的刷入磁盘,但当写入了8KB时,就宕机了这种只写了部分没完成的情况被称为写失效Partial Page Write
Double Write机制
Double Write其实就是写两次,在修改记录redo日志前,先做个副本留个“备胎
注意:Redo日志不能解决写失效问题,因为redo日志记录的是对页的修改记录而不是数据本身
Double Write 崩溃恢复过程
首先找到系统表空间中Double Write区域对应的页副本数据
然后将其复制到独立表空间
最后应用redo日志