redo log 的写入方式

63 阅读1分钟

在 MySQL 中,redo log 的写入方式采用了 Write-Ahead Logging(WAL)的机制,确保事务的持久性和一致性。

  1. 日志缓冲(redo log buffer): 当执行一条 DML(Data Manipulation Language)语句时,相关的修改操作会先被写入 redo log buffer,这是位于内存中的缓冲区。这样可以提高写入性能,因为写入内存比写入磁盘更快。

  2. OS buffer: redo log buffer 中的日志在事务提交时,可能不会立即写入磁盘,而是会先写入到操作系统的缓冲区(OS buffer)。这个过程是异步的,可以提高性能。MySQL 提供了参数 innodb_flush_log_at_trx_commit 来配置刷盘策略。

    • innodb_flush_log_at_trx_commit=0:表示每秒将 redo log buffer 的内容写入 OS buffer,然后按一定策略刷盘到磁盘。这是一种延迟写的方式,可能会有一秒钟的数据丢失。
    • innodb_flush_log_at_trx_commit=1:表示每次事务提交时都将 redo log buffer 的内容写入 OS buffer,并立即刷盘到磁盘。这是一种实时写的方式,可以保证事务的 ACID 特性。
    • innodb_flush_log_at_trx_commit=2:表示每次事务提交时将 redo log buffer 的内容写入 OS buffer,然后按一定策略刷盘到磁盘,但不是立即刷盘。这是一种实时写、延迟刷的方式。

这种日志写入方式保证了即使在发生崩溃或者故障的情况下,通过 redo log 的重放机制,可以恢复事务的原子性和一致性。