Redo log 重做日志(持久性)
数据更新的过程如下:
Mysql为了提高写数据效率,将磁盘的数据以页(16K,可配置)为单位刷入未存的buffer中,修改数据后,将脏页刷入磁盘,假如刷脏前宕机,无法保证数据的持久性
redo log可以解决此问题
- redo log的WAL机制,write ahead log,数据写入磁盘前,先写日志,通过log可以持久化恢复数据
- 更改的数据临时存储buffer,等待刷脏,降低随机写的性能消耗(转成顺序写),提升数据库性能
- Force-log-at-commit机制:提交事务前,必须把产生的日志刷到磁盘持久化
redo log生成过程
redo log持久化
redo log的持久化关系到数据恢复时的数据完整性.
innodb_flush_log_at_trx_commit:控制redo log 刷盘时间 0: 跟随主线程每秒fsync() 操作落盘 1: 提交事务是,写入文件系统缓存,并调用fsync()落盘,最安全 2: 提交事务时,写文件系统缓存,等待fsync()
fsync():文件系统缓存同步到硬盘持久化的方法,mysql主线程每秒执行1次(阻塞执行)
类似bin_log 的 sync_binlog=1
redo log恢复数据
innodb启动时,会根据redo log文件恢复checkpoint之后的数据
MySQL正常退出前会刷脏,所以正常退出不用恢复数据,但还是会执行恢复的过程
redo log文件会分文多个文件,总大小是固定,循环使用,每个redo log文件,都分成一个个512字节的小块block。每个redo log文件的前4个block作为管理块,不会用于存储redo log记录。
checkpoint机制 将脏页持久化
如果缓冲池无限大可以放下所有数据,redolog也无限大,可以记录所有的修改, mysql就可以不用将数据持久化到硬盘 , 但这是不可能的.
checkpoint可以解决以下问题:
1.缩短数据库恢复时间, 假如需要重做的数据很多, 重做工作量很大. 2.缓冲池不够用时,根据LRU算法会溢出最近最少使用的数据页, 如果这个数据页是脏页, 则将数据刷入磁盘 3.重做日志不可用时, redo log的文件不是无限大,而是循环使用的, 当循环使用覆盖到指定redo log时, 要强制刷入磁盘.
checkpoint时机
- Sharp checkpoint:切换日志文件时,将所有的redo log刷盘
- fuzzy checkpoint:一次只刷一小部分的日志到磁盘
- master thread checkpoint:由master线程控制,每秒或每10秒异步刷入一定比例的脏页到磁盘
- flush_lru_list checkpoint:LRU(lru算法) list满溢出数据页,如果为脏页,刷入磁盘
- async/sync flush checkpoint: 脏页比例高(参数控制),同步刷盘,比例低,异步刷盘或不刷
- dirty page too much checkpoint: 脏页太多触发(参数控制),保证足够空间