redo log 怎么刷入磁盘的知道吗?

redo log的写入并不直接写入磁盘,而是在内存中有一个称为"redo log buffer"的连续内存空间,也就是"重做日志缓冲区"。

什么时候会将redo log刷新到磁盘?

在以下情况下,日志缓冲区的数据会被刷新到磁盘:

  • 当日志缓冲区空间不足时:日志缓冲区的大小是有限的,如果持续向日志缓冲区写入日志,当写入的日志量占据了缓冲区总容量的约一半时,就需要将这些日志刷新到磁盘上。
  • 当事务提交时:为了保证持久性,会将日志缓冲区中的所有日志刷新到磁盘。需要注意的是,在事务提交时,除了当前事务的日志外,可能还会刷新其他事务的日志。
  • 后台线程输入:每秒大约会将日志缓冲区中的redo log刷新一次到磁盘。
  • 正常关闭服务器时。
  • 触发检查点(checkpoint)规则:重做日志缓冲区和重做日志文件都以固定大小的块(block)进行保存,这些块被称为"重做日志块"(redo log block),块的大小是固定的,通常为512字节。重做日志以循环写入的方式进行,从头到尾进行写入,当写入位置达到文件末尾后,会回到文件开头继续写入。在这个过程中,有两个标记位置:写入位置(write pos)和检查点位置(checkpoint)。写入位置随着写入而后移,当写到第三个文件末尾时会回到第一个文件的开头。检查点位置表示要擦除的位置,也会随着写入的进行而后移,并循环进行。在擦除记录之前,需要将记录更新到磁盘。当写入位置追上检查点位置时,表示重做日志已经写满。这时候无法继续写入数据,需要执行检查点规则来腾出可写空间。检查点规则指的是,在触发检查点后,将缓冲区中的日志页都刷新到磁盘中。

标签: java, Java面试题, MySQL, Java问题合集, MySQL面试题, Java编程, Java问题精选, Java常见问题