在这片文章中,我会提供一些关于如何设置 MySQL的 innodb_log_file_size
参数的一些建议。mysql
跟其余数据库管理系统同样,MySQL经过日志来实现数据的持久性(在使用InnoDB存储引擎的前提下)。这确保了当一个事务提交后,其相关数据在崩溃或者服务器掉电的状况下不会丢失。sql
MySQL的InnoDB 存储引擎使用一个指定大小的Redo log空间(一个环形的数据结构)。Redo log的空间经过innodb_log_file_size
和innodb_log_files_in_group
(默认2)参数来调节。将这俩参数相乘便可获得总的可用Redo log 空间。尽管技术上并不关心你是经过innodb_log_file_size
仍是innodb_log_files_in_group
来调整Redo log空间,不过多数状况下仍是经过innodb_log_file_size
来调节。数据库
为InnoDB引擎设置合适的Redo log空间对于写敏感的工做负载来讲是很是重要的。然而,这项工做是要作出权衡的。你配置的Redo空间越大,InnoDB就能更好的优化写操做;然而,增大Redo空间也意味着更长的恢复时间当出现崩溃或掉电等意外时。服务器
关于恢复时间,并很差预测对于一个指定的 innodb_log_file_size 值出现崩溃是须要多长的恢复时间--他取决于硬件能力、MySQL版本以及工做负载等因素。然而,通常状况下咱们能够按照每1GB的Redo log的恢复时间大约在5分钟左右来估算。若是恢复时间对于你的使用环境来讲很重要,我建议你作一些模拟测试,在正常工做负载下(预热完毕后)模拟系统崩溃,来评估更准确的恢复时间。数据结构
虽然恢复时间能够做为一个限制innodb_log_file_size的参考因素,也还有一些别的方式能够观察该参数设置是否“合理”(尤为是若是你安装了PMM: Percona Monitoring and Management)ide
检查Percona Monitoring and Management的“MySQL InnoDB Metrics”仪表盘,若是你看到以下的图像:
图中 Uncheckpointed Bytes 已经很是接近 Max Checkpoint Age,那么你几乎能够肯定当前的 innodb_log_file_size 值由于过小已经某种程度上限制了系统性能。增长该值能够较为显著的提高系统性能。性能
而若是你看到的相似下图:
该图中 Uncheckpointed Bytes 远小于 Max Checkpoint Age,这种状况下再增长 innodb_log_file_size 就不会有明显性能提高。测试
注意:不少MySQL设置都是相互关联的,虽然一个特定的Redo log 空间对于一个较小的InnoDB Buffer Pool值来讲可能已经足够,可是较大的InnoDB Buffer Pool值仍是指望更大的Redo log 空间以达到更好的表现。优化
另外一件须要记住的事:咱们以前说的恢复时间,取决于 Uncheckpointed Bytes 而不是总的Redo log空间。若是你在增长了innodb_log_file_size以后并未观察到恢复时间的增长,那可能就是以前的配置在你当前的工做负载下已经够用,你增长的空间并未被彻底利用。3d
另外一个观察innodb_log_file_size的途径是 Redo log空间的使用状况:
这张图片展现了每小时写入日志文件的总数据量和innodb_log_file_size的值。上图中,咱们有2G的Redo log空间可是每小时却有12G多的数据被写入日志文件。这意味着Redo空间差很少每十分钟就轮转一次。
而InnoDB 在每次Redo log空间轮转时都要将innodb buffer pool中的每一个脏页都刷新到磁盘上。当这个操做出现越少时InnoDB越能获得更好的表现(对SSD硬盘的磨损也越少)。我但愿看到这个操做的频率能达到至少15分钟一次,固然越少越好。
关于Redo 空间的使用状况,若是没有安装PMM的话,也能够经过下面的命令来观察每小时的写入量(MB):
a=$(mysql -uuser -p'passwd' -e "show engine innodb status\G" | grep "Log sequence number" | awk '{print $4}'); sleep 60; b=$(mysql -uuser -p'passwd' -e "show engine innodb status\G" | grep "Log sequence number" | awk '{print $4}'); let "res=($b-$a)*60/1024/1024";echo $res
总结:设置合适的innodb_log_file_file_size对于平衡性能和恢复时间来讲很是重要。可是记住,你的场景下的恢复时间因为受所方面因素影响,并不能彻底准确的预估出来。我但愿本文中讨论的几点能帮助你设置更合理的innodb_log_file_file_size。