MySQL更新操作除了要和查询操作走一样的流程外(即经过连接器,查询缓存,分析器,优化器,执行器,存储引擎的操作),还涉及到两个重要的日志模块。分别是重做日志(redo log)和归档日志(binlog)。
今天先来介绍一下重做日志(redo log)。
首先要说明一下,redo log是InnoDB引擎独有的日志。那么InnoDB引擎为什么要开发redo log呢?
这是因为MySQL的更新操作有一个问题,那就是如果每一次更新操作都要写入磁盘,磁盘就需要先找到对应记录,然后再更新。整个过程IO成本,查找成本都很高的问题。
那么如何解决这个问题呢?这里就要用到WAL技术。WAL的全称是Write-Ahead Logging。也就是先写日志,再写磁盘。那么具体怎么做呢?
具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这时更新操作就算完成了。然后InnoDB引擎会找一个系统空闲的时候再把这个操作记录更新到磁盘里面。
因为redo log的大小是固定的。比如可以配置为一组4个文件,每个文件的大小是4G,那么redo log总大小就是4G。我们从头开始写redo log,写到末尾再重新回到开头循环写,就像一个环一样。
当InnoDB把操作记录写磁盘的时候,就要把redo log上面的记录给擦除了。如果redo log被写满了,那么就不能执行新的更新操作。要把原来redo log上面的记录写进磁盘,清理出一些redo log的空间,才可以继续执行新的更新操作。
有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这就是被称为crash-safe的能力。
参考资料: 极客时间 《MySQL实战45讲》
文章转载自码上记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




