Skip to content

Latest commit

 

History

History
15 lines (12 loc) · 1.77 KB

mysql数据库中,产生的redolog都会直接写入磁盘吗?.md

File metadata and controls

15 lines (12 loc) · 1.77 KB

这个问题实际上是在考redo log的结构

Redo Log分为两个部分:

  1. 内存中的日志缓冲区:事务的修改首先记录到内存中的日志缓冲区。
  2. 磁盘上的日志文件:日志缓冲区中的数据会在特定条件下刷新到磁盘上的日志文件中。这个刷新操作可以是因为以下几个原因触发的:
    • 日志缓冲区满:当日志缓冲区接近或达到其容量限制时,其中的数据会被刷新到磁盘。
    • 事务提交:当一个事务提交时,为了保证其持久性,与该事务相关的日志会被写入到磁盘。但由于性能的考虑,MySQL可能会延迟物理写入到磁盘,并使用组提交来提高效率。
    • 定期刷新:MySQL配置中有一个innodb_flush_log_at_trx_commit参数,它控制着Redo Log是如何从日志缓冲区刷新到磁盘的。这个参数有三个值:
      • 0:每秒将日志缓冲区的内容写入到磁盘一次,不考虑事务何时提交。
      • 1:每次事务提交都将日志缓冲区的内容写入到磁盘,这可以提供最高的耐故障能力。
      • 2:每次事务提交,日志缓冲区的内容只是写入到操作系统的缓冲区中,然后由操作系统来决定何时写入到磁盘。
    • 其他情况:比如执行了FLUSH LOGS命令,或者系统执行了检查点操作。

因此,不是所有产生的Redo Log都会直接写入磁盘;这取决于MySQL的配置和当前的系统状态。**在高并发的环境下,MySQL会尝试优化I/O操作以提高性能,但这可能会稍微降低数据的持久性。**如果你需要保证每个事务的持久性,应该设置innodb_flush_log_at_trx_commit1,这样就可以确保每次事务提交时Redo Log都会被刷新到磁盘。