当前位置:   article > 正文

MySQL之innodb_log_buffer_size和innodb_log_file_size_innodb log buffer size

innodb log buffer size

Innodb_log_buffer_size 定义InnoDB用于写入磁盘上的日志文件的缓冲区的大小(以字节为单位) 。默认大小为16MB。较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将日志写入磁盘。

一、日志缓冲池相关参数说明

1)系统变量参数

  • innodb_log_files_in_group
    日志文件中日志组。 InnoDB以循环方式写入文件。默认值(推荐值)为2,也就是两个ib_logfile文件。

  • innodb_log_file_size
    日志组中每个日志文件的字节大小。日志文件的组合大小((innodb_log_file_size * innodb_log_files_in_group) )不能超过略小于512GB的最大值。通常,日志文件的组合大小应该足够大,以便服务器能够消除工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理一个多小时的写活动。值越大,缓冲池中所需的检查点刷新活动就越少,从而节省磁盘I/O。日志文件越大,崩溃恢复速度也越慢。在MySQL 5.7.11中,(innodb_log_file_size 的最小值从1MB增加到4MB。

  • innodb_flush_log_at_trx_commit
    控制如何将日志缓冲区的内容写入磁盘并刷新到磁盘。

  • innodb_flush_log_at_timeout
    控制日志刷新频率

1)运行状态变量

  • Innodb_log_waits
    日志缓冲区太小并且需要等待刷新才能继续的次数。该值等于0或者接近0,说明Innodb_log_buffer_size设置合适。
二、合理设置日志缓存池相关参数

1、Innodb_log_file_size 一般设置128M,实际不够可根据如下规则调整。

# 具体依据如下:我经常设置为 64-512MB
# 一般来说,日志文件的全部大小,应该足够容纳服务器一个小时的活动内容。
# 首先在业务高峰期,计算出1分钟写入的redo量,然后评估出一个小时的redo量

mysql> pager grep  Log       #使用page之后,执行的命令只显示 Log 开头的
PAGER set to 'grep  Log'

mysql> show engine innodb status\G select sleep(60); show engine innodb status\G;
select UserID , IMEI , regtime,LoginName,PlatID,PlatType,Mobile from register_info where LoginName = '931011910@365you'
Log sequence number 12701144821588
Log flushed up to   12701144603368
1 row in set (0.08 sec)

1 row in set (1 min 0.00 sec)

Log sequence number 12701162651514
Log flushed up to   12701162471514
1 row in set (0.00 sec)

mysql> select (12701162651514-12701144821588)/1024/1024 as MB;
+-------------+
| MB          |
+-------------+
| 17.00394249 |
+-------------+
1 row in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Log sequence number,这是写入事务日志的总字节数。所以,现在你可以看到每分钟有多少MB日志写入,通过计算后得到每分钟有17M的日志写入。根据经验法则。通常我们设置redo log size足够大,能够容纳1个小时的日志写入量。

1小时日志写入量=17M * 60=1 020M,由于默认有两个日志重做日志文件ib_logfile0和ib_logfile1。在日志组中的每个重做日志文件的大小一致,并以循环的方式写入。innodb存储引擎先写重做日志文件0,当达到文件的最后时,会切换到重做日志1,并checkpoint。以此循环。

所以我们可以大约设置innodb_log_file_size=512M。注意:在innodb1.2.x版本之前,重做日志文件总的大小不得大于等于4G,而1.2.x版本将该限制扩大到了521G。

总结:

  • innodb_log_file_size 设置太小,当一个日志文件写满后,innodb会自动切换到另外一个日志文件,而且会触发数据库的检查点(checkpoint),这会导致innodb缓存脏页的批量刷新,会明显降低innodb的性能。
  • innodb_log_file_size 设置太大,减少了checkpoint,并且由于redo log是顺序I/O,大大提高了I/O性能。但是如果数据库意外出现了问题,比如意外宕机,那么需要重放日志并且恢复已经提交的事务。如果日志很大,那么将会导致恢复时间很长,甚至到我们不能接受的程度。

Reference

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/575923
推荐阅读
相关标签
  

闽ICP备14008679号