一、什么是redolog日志
redolog又叫重做日志,处于存储引擎层,是innodb特有的日志。主要是为了实现事务的持久性而存在的。事务的持久性:只要提交了事务,出现停机或者崩溃的情况,都能将提交事务的数据修改正常持久化到磁盘。
二、redolog日志记录的是什么
redolog记录的是当前事务对数据页的修改,每条redo记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成,记录的是事务在那个表空间对那个数据做的修改,属于物理日志。
三、redolog的是怎么保存的
redolog的记录可以理解成一个圆环,循环覆盖写入,当redolog满了时,系统就会停止所有更新,促进checkpoint推进。硬盘上存储的redo log日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的,比如可以配置为一组4个文件,每个文件的大小是1GB,整个redo log日志文件组可以记录4G的内容。
四、redolog的刷盘时机
mysql里面的操作都是遵循WAL(write ahead log),先写入日志文件再写入磁盘。日志文件的写入都是顺序写(包括binlog和undolog)。redolog对应的缓存区为redolog buffer。这个缓存区域的刷盘可以通过"innodb_flush_log_at_trx_commit"进行配置,支持三种策略
- 设置为0的时候,表示每次事务提交时不进行刷盘操作
- 设置为1的时候,表示每次事务提交时都将进行刷盘操作(默认值)
- 设置为2的时候,表示每次事务提交时都只把redo log buffer内容写入page cache
另外InnoDB存储引擎还有两个兜底的刷盘规则
- 有一个后台线程,每隔1秒,就会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用fsync刷盘。
- redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动刷盘。
所以当innodb_flush_log_at_trx_commit设置为0时,刷盘的时机就是兜底1,每隔1秒刷新,最差就是丢失1秒的数据。
当设置为1时,不会有数据丢失,即使是崩溃了,这部分事务没有提交,那么日志也不存在,也就不存在丢失,但是这个的性能就不太好。
当设置为2时,如果是mysql挂了,不会有任何损失,但是如果是系统重启了,可能会有1秒的数据丢失。
五、redolog和binlog的两阶段提交
commit提交事务时的操作,为先写redolog(prepare) -> 写binlog ->写redolog(commit):
1、prepare阶段,写redo log;
2、commit阶段,写binlog并且将redo log的状态改成commit状态;
mysql发生崩溃恢复的过程中,会根据redo log日志,结合 binlog 记录来做事务回滚:
1、如果redo log 和 binlog都存在,逻辑上一致,那么提交事务;
2、如果redo log存在而binlog不存在,逻辑上不一致,那么回滚事务;