MySQL 中的 Log Buffer 是什么?它有什么作用?

Sherwin.Wei Lv7

MySQL 中的 Log Buffer 是什么?它有什么作用?

回答重点

MySQL 中的 Log Buffer 是一个内存区域,用于暂时存储事务日志(redo log)的数据。在 InnoDB 存储引擎中,它的主要作用是提高性能,通过批量写入操作将日志数据从内存中写入磁盘,减少磁盘 I/O 操作的频率。

扩展知识

进一步理解 Log Buffer

我们来看一下官网的一张图:

710.png

我们看看 Log Buffer。从上面的图我们可以得知,它是 redo log 做缓冲用的。

redo log 我们都知道是重做日志,用来保证崩溃恢复数据的正确性,innodb 写数据时是先写日志,再写磁盘数据,即 WAL (Write-Ahead Logging),把数据的随机写入转换成日志的顺序写。

但,即使是顺序写 log ,每次都调用 write 或者 fsync 也是有开销的,毕竟也是系统调用,涉及上下文切换。

于是乎,搞了个 Log Buffer 来缓存 redo log 的写入。

即写 redo log 先写到 Log Buffer 中,等一定时机再写到 redo log 文件里。

我们每次事务可能涉及多个更改,这样就会产生多条 redo log,这时会都先写到 Log Buffer 中,等事务提交的时候,一起将这些 redo log 写到文件里。

或者当 Log Buffer 超过总量的一半(默认总量是 16mb),也会将数据刷到 redo log 文件中。

也有个后台线程,每隔 1s 就会将 Log Buffer 刷到 redo log 文件中。

从上面这些我们得知,Log Buffer 其实就是一个写优化操作,把多次 write 优化成一次 write,一次处理多数据,减少系统调用。

看到这肯定有小伙伴说,数据先写 Log Buffer 而不刷盘,这数据不会丢吗?

innodb 其实给了个配置,即 innodb_flush_log_at_trx_commit 来控制 redo log 写盘时机。

  • 当值为 0,提交事务不会刷盘到 redo log,需要等每隔一秒的后台线程,将 log buffer 写到操作系统的 cache,并调用 fsync落盘,性能最好,但是可能会丢 1s 数据。
  • 当值为 1,提交事务会将 log buffer 写到操作系统的 cache,并调用 fsync 落盘,保证数据正确,性能最差,这也是默认配置
  • 当值为 2,提交事务会将 log buffer 写到操作系统的 cache,但不调用 fsync,而是等每隔 1s 调用 fsync 落盘,性能折中,如果数据库挂了没事,如果服务器宕机了,会丢 1s 数据。

具体如何配置看你的业务了。至此,想必你应该了解 Log Buffer 是干啥用了的吧。

Comments
On this page
MySQL 中的 Log Buffer 是什么?它有什么作用?