MySQL 的 redo 日志有什么用?
作用:保证事务的持久性
MySQL 作为一个存储系统,为了保证数据的可靠性,最终得落盘。但是,又为了数据写入的速度,需要引入基于内存的"缓冲池"。其实不止 MySQL ,这种引入缓冲来解决速度问题的思想无处不在。既然数据是先缓存在缓冲池中,然后再以某种方式刷新到磁盘,那么就存在因宕机导致的缓冲池中的数据丢失,为了解决这种情况下的数据丢失问题,引入了redo log。在其他存储系统,比如 Elasticsearch 中,也有类似的机制,叫 translog。
但是一般讨论数据写入时,在 MySQL 中,一般叫事务操作,根据事务的 ACID 特性,如何保证一个事务提交后 Durability 的保证?而这就是 redo log 的作用。当向 MySQL 写用户数据时,先写 redo log,然后 redo log 根据"某种方式"持久化到磁盘,变成 redo log file,用户数据则在 "buffer" 中(比如数据页、索引页)。如果发生宕机,则读取磁盘上的 redo log file 进行数据的恢复。从这个角度来说,MySQL 事务的持久性是通过 redo log 来实现的。