Log Buffer的功能和工作原理

发布时间:2024年01月22日

1、工作原理

  1. 当事务开始并执行修改操作时,InnoDB生成相应的重做日志记录,并把它们放入Log Buffer中。(Log Buffer的大小由innodb_log_buffer_size配置调整)
  2. 根据innodb_flush_log_at_trx_commit的设置,在事务提交时,Log Buffer中的重做日志可能会被刷新到磁盘上的重做日志文件。如果设置为1,则每次提交都刷新;如果是0或2,则按照各自的规则进行。
  3. 在日志刷新之前,如果Log Buffer满了或者达到了一定的条件(如超过一定时间),InnoDB也会将Log Buffer中的内容刷新到磁盘中。
  4. 此外,InnoDB还会定期执行“检查点”操作,在这个过程中,把部分重做日志应用到数据文件,并清理已经不再需要的重做日志信息。

2、innodb_log_buffer_size

这个配置参数定义了Log Buffer的大小,即InnoDB可用于存储重做日志数据的内存区域有多大。

innodb_log_buffer_size大小设置对系统影响

????????若该值设置得较大,InnoDB就能在内存中缓存更多的日志信息,从而减少因为等待日志刷新到磁盘而造成的延迟。这对于写入密集型应用来说是有利的。但是,如果设置过大,系统可能会浪费内存,特别是在日志活动不是很频繁的情况下。如果太小,则可能导致在高负载下频繁地将日志刷新到磁盘,从而影响性能。

通过监控Innodb_log_waits参数调整参数:

??Innodb_log_waits 是一个MySQL状态变量,它表示由于重做日志缓冲区(Log Buffer)不足而导致的等待次数。换句话说,当InnoDB Log Buffer已满,并且需要更多空间来记录新的重做日志信息时,正在执行的事务必须等待直到有足够的空间,因为InnoDB需要先将当前缓冲区中的日志信息刷新(写入和同步)到重做日志文件中以释放空间。
要查看Innodb_log_waits的当前值,可以使用如下命令:

SHOW GLOBAL STATUS LIKE 'Innodb_log_waits';
  • 如果值为0或很小,并且不经常增加,表明当前的Log Buffer大小通常是足够的。
  • 如果该值持续增大,应考虑增加innodb_log_buffer_size的大小。

3、innodb_flush_log_at_trx_commit

这个配置参数控制着InnoDB何时将Log Buffer中的日志信息刷新到磁盘上的重做日志文件,与数据的持久性直接相关。

  • 设置为1:每次事务提交时,都会强制将Log Buffer中的内容刷新到磁盘。这提供了最好的数据持久性保证,因为即使发生崩溃,所有已提交的事务的重做日志都已经安全地写入到磁盘中。
  • 设置为0:Log Buffer不会在每个事务提交时刷新,而是每秒刷新一次。这可以提高性能,但如果MySQL意外崩溃,你可能会丢失最近1秒内提交的事务数据。
  • 设置为2:在每个事务提交时,日志信息被写入磁盘,但不是同步刷新。刷新操作会根据操作系统的I/O调度进行。这种模式下,性能比设置为1要好,但如果操作系统或者硬件发生故障,依然有数据丢失的风险。
文章来源:https://blog.csdn.net/jkzyx123/article/details/135753322
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。