NoteDeep
本页讨论
  • redo log 缓冲区是什么?
  • redo log 缓冲区实现原理
  • redo log相关配置
redo log缓冲区是一块内存区域,保存将要写入redo log的数据。
mysql 崩溃恢复是需要redo log的。

redo log缓冲区大小由innodb_log_buffer_size配置选项定义。
redo log缓冲区会定期把内存中的回滚日志刷到磁盘上。一个大的redo log缓冲区意味着允许大事务运行,而无需在事务提交之前将redo log写入磁盘。因此,如果您有更新,插入或删除多行的事务,则使用更大的redo log缓冲区可节省磁盘I/O。

redo log 缓冲区实现原理


innodb_flush_log_at_trx_commi控制如何将redo log缓冲区的内容写入到日志文件。 innodb_flush_log_at_timeout控制redo log缓存写到redo log文件的频率。

InnoDB 修改数据操作,实际上修改的是Buffer Pool中的数据。
为了保障数据的安全稳定,不丢失数据。InnoDB并不是一个事务提交后就将 Buffer Pool 中被修改的数据同步到磁盘上,而是要先记录到redo log日志中,以防崩溃之后可以恢复。
最后再从Buffer Pool 中把脏页连续写入磁盘。
而是记录到redo log日志中也不是直接写磁盘,而是先写到redo log 缓冲区



     控制 InnoDB 事务日志刷新方式参数:innodb_flush_log_at_trx_commit :


  • innodb_flush_log_at_trx_commit  = 0, InnoDB 中的 Log Thread 每隔 1秒将 log buffer 中的数据写入文件,同时还会通知文件系统进行与文件同步的 flush操作,保证数据确实已经写入磁盘。
  • innodb_flush_log_at_trx_commit = 1, InnoDB 默认设置。每次事务的结束都会出发 Log Thread 将 Log Buffer 中的数据写入文件、并通知文件系统同步文件。这个设置最安全,能够保证不论是 MySQL 崩溃、OS崩溃还是主机断电都不会丢失任何已经提交的数据。
  • innodb_flush_log_at_trx_commit = 2, 每次事务结束的时候将数据写入事务日志,仅仅是调用了文件系统的文件写入操作。而文件系统都是有缓存机制的,所以 Log Thread 的写入并不能保证内容已经写入到物理磁盘完成持久化的动作。文件系统什么时候会将缓存中的数据同步到物理磁盘、文件, Log Thread 就完全不知道,所以,当设置 2 的时候, MySQL 崩溃并不会造成数据的丢失,但是 OS 崩溃或主机断电后可能丢失的数据量就完全控制在文件上了。
分析:
设置1 最安全,由于 IO 同步操作多,所以,性能最低。
设置 0 ,则每秒一次同步,性能相对高一下。
如果设置 2 ,性能可能是三种最好的。但是也可能出现故障后丢失数据最多的一种。如果 OS 足够稳定,主键硬件设备足够好,且主机供电系统足够安全,可将设置为2 ,让系统整体性能尽可能高。【建议设置为 2】

redo log相关配置


innodb_log_buffer_size的大小:(默认8M)
mysql> show variables like 'innodb_log_buffer_size%';
+------------------------+---------+
| innodb_log_buffer_size | 8388608 |
+------------------------+---------+

重做日志缓冲不需要设置的太大,只要保证每秒产生的事务量在缓冲大小范围之内。因为每秒都会刷新缓冲到日志文件。8M足够了。

日志文件名:
1.innodb_log_group_home_dir参数指定的目录下有两个文件:ib_logfile0,ib_logfile1
2.该文件被称为:重做日志文件(redo log file)
3.例如:服务器意外宕机导致实例失败,Innodb存储引擎利用重做日志恢复到宕机前的状态,以此保证数据的完整性。

日志文件组:
1.每个Innodb存储引擎至少有1个重做日志文件组,每个组至少包含2个重做日志文件(ib_logfile0,ib_logfile1).
2.可以通过设置多个镜像日志组(mirrored log groups),将不同组放到不同磁盘,提高重做日志的高可用性。
3.日志组中的文件大小是一致的,以循环的方式运行。文件1写满时,切换到文件2,文件2写满时,再次切换到文件1.

日志文件参数:
1.innodb_log_file_size 重做日志文件的大小。
2.innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2
3.innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1
4.innodb_log_group_home_dir 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。









评论列表

  • 半寸草
    半寸草

    知识整理的很棒  2019年8月18日 9:0

redo log 缓冲区实现原理
redo log相关配置