MySQL崩溃恢复的原理和过程是怎样的?
摘要:本文稍微有点晦涩、但是看过之后你就能Get到MySQL的崩溃恢复到底是怎么做的! 文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽📖活动 回顾 在这篇文章之前,白日梦跟你分享了什么是redo l
目录回顾思考一个问题checkponit机制Checkpoint的种类及触发条件LSN推荐阅读
本文稍微有点晦涩、但是看过之后你就能Get到MySQL的崩溃恢复到底是怎么做的!
文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽📖活动
回顾
在这篇文章之前,白日梦跟你分享了什么是redo log、以及redo log的作用、redo log的刷盘机制等知识点。简单来说就是redo log是MySQL的事物日志。比如你执行一条update语句,在你提交事物之前MySQL就会在redo log中记录下你这条SQL对XXX表空间XXX数据页的XXX偏移量做了XXX更新。
思考一个问题
为什么在你当update时,事物提交之前先不断的写redo log呢?
如果你看过白日梦前面介绍buffer pool的文章,这个问题的答案想必你也能很快的想出来:MySQL为了提高性能,你对它数据行的增、删、改操作其实都优先发生在内存(Buffer Pool)中。那你想,假如你update了某些数据,Buffer Pool中的数据页也就会被你改成脏数据页。那万一你刚修改完并提交了事物,还没来得及将数据落盘MYSQL就宕机了怎么办?
当MySQL重启的时候需要把方才修改的内容恢复出来吧,不然数据就不一致了。那怎么恢复呢?就借助redo log恢复。因为前面说了,当你begin事物开始操作时,会先写redo log,在操作数据页。这个数据恢复的过程也叫做重做。
checkponit机制
随着MySQL的运行,Buffer Pool中的数据页会被修改成脏数据页,当你开启事物进行一系列的操作时MySQL会为你不停的记录一堆日志,拿redolog来说,rodo log也是需要往先往内存中写,再以块的形式刷新回磁盘。
无论怎样都会存在这样一个中间过程:内存中存在脏数据页、和脏日志未来得及刷新回磁盘。
而本小节中要说的Checkpoint机制就是将这些脏数据刷新回磁盘的机制,即只要发生Checkpoint,就要将脏数据刷新回磁盘,反过来,当MySQL重启时会去找Checkpoint,并且根据Checkpoint的特性。MySQL可以明确的知道checkponit之前的脏数据已经落过盘了,重启时没必要进行重做。
看到这里你已经大概知道Checkpoint是什么了。我们在稍微总结一下Checkpoint机制的作用:
1、所谓的崩溃恢复,其实就是MySQL重启时照着redo log中的最后一次Checkpoint之后的日志回放一遍
2、因为Checkpoint会不断的更新,并且MySQL重启时只需要对Checkpoint之后的数据进行恢复,所以Checkpoint会缩短MySQL重启的时间。
3、因此每次进行Checkpoint时buffer pool中的脏数据页、redo log中的脏日志都会落盘。所以Checkpoint实际上起到了为这两者进行瘦身的作用。维持两个的可用性。
Checkpoint的种类及触发条件
有两种:Checkpoint
1、Sharp(急剧的) Checkpoint
触发时机:比如当MySQL关闭时,或者是切换要写的redo log时,会一次性将所有的脏日志全部刷新到磁盘中,这种模式下会对MySQL的性能带来较大的影响。
2、Fuzzy(模糊的) Checkpoint
这种模式下的Checkpoint每次仅将部分脏日志刷新到磁盘中
触发条件1:Master Thread Checkpoint
由master线程控制,每秒或每10秒刷入一定比例的脏页到磁盘。
触发条件2:FLUSH_LRU_LIST Checkpoint
从MySQL5.6开始可通过 innodb_page_cleaners 变量指定专门负责脏页刷盘的page cleaner线程的个数,该线程的目的是为了保证lru列表有可用的空闲页。
触发条件3:async/sync flush Checkpoint
同步刷盘还是异步刷盘。例如还有非常多的脏页没刷到磁盘,这时候会选择同步刷到磁盘,但这很少出现;如果脏页不是很多,可以选择异步刷到磁盘,如果脏页很少,可以暂时不刷脏页到磁盘
触发条件4:dirty page too much Checkpoint
脏页太多时强制触发检查点,目的是为了保证缓存有足够的空闲空间。too much的比例由变量 innodb_max_dirty_pages_pct 控制,MySQL 5.6默认的值为75,即当脏页占缓冲池的百分之75后,就强制刷一部分脏页到磁盘。
LSN
LSN全称是:log sequence number。
