redo log 是环形日志
redo log 日志缓冲区,默认大小是 16MB,由参数 innodb_log_buffer_size 控制
redo log buffer 内部又可以划分为许多 redo log block,每个 redo log block 大小为 512 字节。我们写入的 redo log 日志,最终实际上是先写入在 redo log buffer 的 redo log block 中,然后在某一个合适的时间点,将这条 redo log 所在的 redo log block 刷入到磁盘中。
这个合适的时间点究竟是什么时候呢?
MySQL 正常关闭的时候;
MySQL 的后台线程每隔一段时间定时的讲 redo log buffer 刷入到磁盘,默认是每隔 1s 刷一次;
当 redo log buffer 中的日志写入量超过 redo log buffer 内存的一半时,即超过 8MB 时,会触发 redo log buffer 的刷盘;
当事务提交时,根据配置的参数 innodb_flush_log_at_trx_commit 来决定是否刷盘。如果 innodb_flush_log_at_trx_commit 参数配置为 0,表示事务提交时,不进行 redo log buffer 的刷盘操作;如果配置为 1,表示事务提交时,会将此时事务所对应的 redo log 所在的 redo log block 从内存写入到磁盘,同时调用 fysnc,确保数据落入到磁盘;如果配置为 2,表示只是将日志写入到操作系统的缓存,而不进行 fysnc 操作。(进程在向磁盘写入数据时,是先将数据写入到操作系统的缓存中:os cache,再调用 fsync 方法,才会将数据从 os cache 中刷新到磁盘上)
- 始终设置 innodb_flush_log_at_trx_commit=1
- 如果启用了二进制日志记录,请设置
sync_binlog=1
。
这也是大家常说的双1设置。前者保证redolog的不丢失、后者保证了binlog的不丢失。
参考:
谈谈传说中的redo log是什么?有啥用? – 赐我白日梦 – 博客园 (cnblogs.com)
redolog 崩溃恢复
undolog mvcc
binlog server层
:16kb