什么是RedoLog
MySQL中数据是以页为单位被加载的。例如:我们需要更新id=1的记录,那么MySQL会将id=1的记录对应的整个页都加载到内存中然后更新需要被更新的记录。但是如果每次在内存中更新完数据后都将数据页刷入磁盘,这样就非常浪费,并且随机IO性能也较差。而且如果只再内存中更新数据,后由后台线程不定时将数据刷入磁盘,那么如果服务器断电就会导致数据丢失。MySQL通过RedoLog来解决上述问题
RedoLog就是MySQL磁盘上的2个日志文件,安装目录下的ib_logfile0和ib_logfile1,每个文件默认大小为48M。它是以顺序写的形式记录对数据的修改,当一个文件满的时候会写入下一个文件(循环)
基本原理
当数据在BufferPool中被修改之后,同时记录一条Redo Log记录在RedoLogBuffer中,主要记录的信息为:表空间号+数据页号+偏移量+修改几个字节的值+具体的值(对记录做了怎样的修改)。后续再由工作线程将其顺序写入磁盘的日志文件上。如果BufferPool中的信息被修改了,但是还没刷回磁盘就宕机了,那么后续重启后根据redo log将数据进行改写
持久化时机
- 事务提交时。当数据写入了redo log buffer后如果此时宕机了,会造成数据丢失。所以当事务提交的时候必须要将redo log信息存入磁盘
- 后台线程每隔1s定时刷盘
- 写入的redo log buffer日志已经占据了redo log buffer的一半了
- MySQL关闭的时候
