mysql innodb 重做日志 写满了怎么办?

innodb数据目录下默认会有2个名为ib_logfile0和ib_logfile1的重做日志文件,mysql写重做日志的过程是,事务进行的过程中,master thread主线程不断的将事务中的条目,插入到重做日志缓冲,然后同步到磁盘的重做日志文件(ib_logfile),先写日志文件1(ib_logfile0),写满了,再切换至日志文件2(ib_logfile1),当日志文件2被写满了,再切换到日志文件1(ib_logfile0);

问题:既然磁盘上的日志文件1和2已经写满了,为什么还会再重新切换到日志1再写入呢?满了还怎么写入?

阅读 8.9k
2 个回答

innodb 的 ib_logfile 是一个定长的文件,可以通过 my.cnf 里面的 innodb_log_file_size = 64M 来设置。mysql 会在预分配空间里顺序的写入数据,直到写不下就会换到下一个文件继续写,就像在内存里面使用循环数组一样。一般这种 log 没什么长期存在的价值,所以这样的策略非常节省磁盘空间,且可以避免因为文件大小增长造成的磁盘碎片、额外的 IO 等问题。

新手上路,请多包涵

Redo log文件是循环写入的,在覆盖写之前,总是要保证对应的脏页已经刷到了磁盘。在非常大的负载下,Redo log可能产生的速度非常快,导致频繁的刷脏操作,进而导致性能下降,通常在未做checkpoint的日志超过文件总大小的76%之后,InnoDB 认为这可能是个不安全的点,会强制的preflush脏页。 详见:http://mysql.taobao.org/month...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题