简介
log buffer(日志缓存)是一块内存,用以保存要写入log磁盘文件的数据,(注意,这里的log指redo log) log buffer大小是由 innodb_log_buffer_size定义,默认大小为16MB,log buffer中的内容会定期的刷入到磁盘中,一个比较大的log buffer可以让一个较大的事务在提交之前不需要将redo的log数据写入到磁盘中。因此,如果你有事务要update、insert、delete大量行,增加log buffer大小,以节省磁盘IO
The innodb_flush_log_at_trx_commit variable controls how the contents of the log buffer are written and flushed to disk. The innodb_flush_log_at_timeout variable controls log flushing frequency.
innodb_flush_log_at_trx_commit变量控制log buffer的内容如何刷入到磁盘中。 The innodb_flush_log_at_timeout控制刷盘的频率
配置与优化
- 首先要考虑redo日志文件足够大,哪怕与buffer pool一样大。当Innodb写满redo的日志文件,那么就会进行强制检查点,将buffer pool的修改的数据页写入到磁盘中。太小的日志文件就会导致大量不必要的磁盘写入。虽然以前大的redo日志文件导致崩溃恢复时间很长,但是现在已经快很多,可以放心的使用大日志文件。redo日志文件大小也可以 innodb_log_file_size 和innodb_log_files_in_group 一起控制。
- 考虑增加log buffer的大小,一个比较大的log buffer可以让大事务运行时,不需要在commit之前将日志写到磁盘中。因此,如果你的事务update、insert、delete很多行,则生成的redo日志也会很大,放大log buffer可以节约磁盘的IO,log buffer大小使用innodb_log_buffer_size 变量来控制。
- 配置innodb_log_write_ahead_size 一定要避免"read-on-write"(写时读), 所以innodb_log_write_ahead_size大小要与操作系统或者文件系统的block大小的匹配。