MySQL中的 redo 日志文件
MySQL中有三种日志文件,redo log、bin log、undo log。redo log 是 存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性;bin log 是 MySQL 数据库层面上生成的日志,主要用于 point in time 恢复和主从复制。undo log 主要用于事务的回滚(undo log 记录的是每个修改操作的逆操作) 和 一致性非锁定读(undo log 回滚行记录到某种特定的版本---MVCC 多版本并发控制)。
redo log 和 undo log 都是存储引擎层面上生成的日志,并且都记录了数据的修改:只不过 redo log记录的是"物理级别"上的页修改操作,比如页号xxx、偏移量yyy写入了'zzz'数据;而undo log 记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么 undo log就记录一条与之相反的DELETE操作。
redo log 作用
MySQL作为一个存储系统,为了保证数据的可靠性,最终得落盘。但是,又为了数据写入的速度,需要引入基于内存的"缓冲池"。其实不止MySQL,这种引入缓冲来解决速度问题的思想无处不在。既然数据是先缓存在缓冲池中,然后再以某种方式刷新到磁盘,那么就存在因宕机导致的缓冲池中的数据丢失,为了解决这种情况下的数据丢失问题,引入了redo log。在其他存储系统,比如Elasticsearch中,也有类似的机制,叫translog。
但是一般讨论数据写入时,在MySQL中,一般叫事务操作,根据事务的ACID特性,如何保证一个事务提交后Durability的保