最近在排查MySQL的问题,查资料的过程中看到MySQL本身的设计,感觉还是蛮有意思的,在这里简单记录下。如果玩过MySQL,也许会听过,MySQL可以恢复到本月任意一秒的记录,这个到底是怎么做到的呢?这个过程,少不了日志系统 redo log (重做日志)和 bin log(归档日志)。redo log 和 bin log是什么?极客时间的MySQL课程中有一个很有趣的例子:redo log 就如《孔乙己》小说中赊账的粉板,在客栈比较忙时,先记到粉板上;在客栈打烊前,再记录到账本中,这样就能提升记账的效率。而redo log也借用了这个类似的思想来提升DB更新的效率。传统的思路是更新语句,都要直接写磁盘(账本),可想而知,整个耗时会比较长。但如果在更新记录时,先将记录写到redo log(粉板)上,并更新到内存,等DB引擎比较空闲的时候,再将这条记录写到磁盘里。这也就是常见的WAL(Write-Ahead-Logging)技术,关键就是先写日志,再写磁盘。当然,《孔乙己》的粉板大小有限,一旦满了,就得先把赊账记录写到账本上,然后把粉板擦掉。redo log也是这样,有着固定的大小,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。有了redo log,即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。
crash-safe是什么概念?可以用赊账的场景继续来帮助理解。只要赊账记录记录在了账本或粉板上,即使中间停业几天,但恢复营业后,根据账本和粉板,依旧能算出赊账的总额。又快到凌晨了,看了下写不完,先发一篇,待会继续写。