在這片文章中,我會提供一些關於如何設置 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。