innodb_log_file_size - xiaoboluo768/qianjinliangfang GitHub Wiki

  • 控制redo log单个文件的大小。
    • 全局变量,只读变量,默认值为48M,最小值为1M(5.7.11版本开始最小值被增加为4M),最大值5.6.2及其之前的版本为4G,5.6.3版本开始支持最大512G(日志文件的总大小(innodb_log_file_size * innodb_log_files_in_group)不能超过最大值,需要稍小于512GB的最大值。例如,两个255 GB的日志文件综合510G接近但不大于等于限制)
    • 通常,日志文件应足够大,以便服务器能够平均峰值和谷值的性能抖动,使服务器在一个平滑的性能下工作,通常需要redo log能够保存一个小时的写入活动。值越大,缓冲池中需要的检查点刷新活动越少,从而节省磁盘I / O。要注意:虽然MySQL 5.5和更高版本中引入checkpoint机制来减少崩恢复的时间,但是更大的日志文件也使崩溃恢复更慢。
    • 重要
      • 由于Bug#69477,对于大型,外部存储的BLOB字段产生的重做日志写入可能会覆盖最近的检查点。为了解决这个问题,MySQL 5.6.20中引入的补丁将BLOB能够写的重做日志的大小限制为重做日志文件单个大小的10%。在该限制机制下,innodb_log_file_size应设置为大于表的行中最大BLOB数据大小的10倍加上其他可变长度字段(VARCHAR,VARBINARY和TEXT类型字段)的长度的值。
      • 在MySQL 5.6.22中,重做日志BLOB写入限制被放宽并修改为总重做日志大小的10%(innodb_log_file_size * innodb_log_files_in_group)。 (bug#19498877)
    • 当一个日志写满后,innodb会切换到另外一个日志文件,但是切换时会触发数据库检查点,这将导致innodb脏页缓存的小批量刷新,会明显降低innodb的性能,所以可能需要适当加大innodb日志文件大小参数:innodb_log_file_size,但是不能设置过大,过大就意味着需要更长的时间来恢复,一般来说,半小时写满一个日志文件比较合适,下面是即算每小时产生的日志量并估算合适的innodb_log_file_size值的方法:
首先即算每分钟产生的日志量:
pager grep -i 'Log sequence number'
show engine innodb status\G select sleep(60);show engine innodb status\G;
把后边一次结果减去前边一次结果,进行运算,得出的结果就是每分钟产生的日志量,然后乘以60就是一小时的日志量:
select round((2029338537-2029338537) /1024/1024/@@innodb_log_files_in_group) as MB;

查询每分钟的日志量也可以通过查询information_schema.global_status表:
select @a1 := variable_value as a1 from information_schema.global_status
where variable_name = 'innodb_os_log_written' union all select sleep(60) union all
select @a2 := variable_value as a2 from information_schema.global_status
where variable_name = 'innodb_os_log_written';

把后边一次结果减去前边一次结果并进行即算,得出的结果就是每分钟的日志量:
select round((@a2-@a1) /1024/1024/@@innodb_log_files_in_group) as MB;
  • PS:5.7.x中,对于Bug#69477和bug#19498877的提示已经去掉了

上一篇:innodb_file_format | 下一篇:innodb_thread_concurrency