innodb存储引擎的日志文件

如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。
为了解决这个问题,MySQL的设计者用了WAL技术,WAL的全称是WriteAhead Logging,它的关键点就是先写日志,再写磁盘

执行步骤:

  1. 当发生数据修改的时候,innodb引擎会先将记录写到redo log中, 并更新内存,此时更新就算是完成了,同时innodb引擎会在合适 的时机将记录操作到磁盘中。
  2. 同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。

设计细节:

  • Redolog是固定大小的,是循环写的过程,如下图:

image.png

  1. write pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。
  2. checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
  3. write pos和checkpoint之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果write pos 追上checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint推进一下。
  • 有了redolog之后,innodb就可以保证即使数据库发生异常重启, 之前的记录也不会丢失,叫做crash-safe。