说说redo log 写入方式?

1 个回答

  • 罗云海
    只有行动才能说明一切。
    **Redo log 的写入方式**: Redo log 包含两部分内容:内存中的日志缓冲区 (**redo log buffer**) 和磁盘上的日志文件 (**redo log file**)。MySQL 采用的是先写日志、后写磁盘的 **WAL**(Write-Ahead Logging)机制。具体流程如下: 1. **写入 redo log buffer**: - 每执行一条 DML 语句时,MySQL 会首先将修改操作记录写入内存中的 **redo log buffer**,这是用户空间中的操作。 2. **写入 OS 缓冲区**: - 之后,日志会被从 **redo log buffer** 写入操作系统内核空间的 **OS buffer**。这是将日志从用户空间过渡到内核空间的过程。 3. **写入 redo log file(刷盘)**: - 最后,操作系统会在某个时间点,将 **OS buffer** 中的日志一次性刷到磁盘上的 **redo log file**,完成持久化操作。 根据 MySQL 的 **innodb_flush_log_at_trx_commit** 参数配置,**redo log buffer** 到 **redo log file** 的写入方式有不同的策略: ### innodb_flush_log_at_trx_commit 参数的三种配置: 1. **值为 0(延迟写)**: - 事务提交时并不会立即将 **redo log buffer** 中的日志写入 **OS buffer**,而是每秒钟将日志写入 **OS buffer**,并调用系统写操作将其保存到 **redo log file** 中。这种方式可能会在崩溃时丢失最近一秒的数据,但性能较好。 2. **值为 1(实时写,实时刷)**: - 每次事务提交时,都会将 **redo log buffer** 中的日志立即写入 **OS buffer**,并同步刷盘至 **redo log file** 中。此配置提供了最强的 crash-safe 保证,但性能相对较低,因为每次提交都需要进行磁盘写入。 3. **值为 2(实时写,延迟刷)**: - 每次事务提交时,日志会实时写入 **OS buffer**,但每秒钟才会将 **OS buffer** 中的日志同步写入 **redo log file**。这种方式在一定程度上平衡了性能和数据安全性:崩溃时可能会丢失不到一秒的日志,但不会丢失 OS buffer 中的日志。 ![image.png](https://images.codewd.com/306d371c972a4ebd02b79211dab7f511.jpg "image.png") 总结,**redo log** 的写入方式通过配置参数可以实现延迟写、实时写等不同策略,保证了灵活的性能和数据安全性的平衡。
    发布于 2024-09-04 07:37 •IP属地 宁夏
    举报
    评论
    收藏