前言
只要是接触过MySQL的程序员,那么或多或少都有听过redo log(重做日志)和binlog(归档日志)。今天就来分享一下这两个日志的用处和区别。
简单来说,redo log是InnoDB特有的日志,如果使用的是其他存储引擎,就没有redo log,只有binlog。
binlog是MySQL的Server层的日志,不管使用什么存储引擎,都会有binlog的存在。那么,为什么要有redo log和binlog呢?一个binlog不就可以全部解决了吗?接下来我们就来详细看一下redo log和binlog的区别吧。
redo log
在MySQL中,如果你要更新一条语句,需要带更新条件,比如update T set name = ‘god-jiang’ where id=6,一般都是先查询到id=6的语句,然后再进行更新操作。
如果更新的数量是100条,1000条甚至10000条的时候,每一次更新都需要写到磁盘上。然后磁盘也要找到对应的记录,然后再更新,整个过程IO成本、查找成本太大,为了解决这个问题,MySQL的设计者采用了WAL技术来解决。WAL全称是Write Ahead Logging,意思就是先写日志,再写磁盘。
具体操作:当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log中,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候(系统空闲时),将这个操作记录更新到磁盘中,这个更新往往是在系统比较空闲的时候。
但是redo log的大小是固定的,不可能一直无限写,让我们看下MySQL怎么做到的吧。
write pos是当前记录的位置,一边写一边往后移动。check point是当前要擦除的位置,也是往后移动并且循环的,擦除记录之前要把记录更新到数据文件中。
write pos与check point之间绿色的部分表示可以记录新的操作。如果write pos追上了check point,表示redo log满了,这个时候就不能继续执行新的操作,需要停下擦除一些记录,并且把check point往后推进。
有了redo log,InnoDB可以保证即使数据库发现异常重启了,也不会丢失之前提交的事务,这个能力也被称为crash-safe。