innodb_log_file_size

之前的一篇簡單介紹了的作用,下面接下來和大家分享一下innodb的日誌文件相關的參數的作用。

  • innodb_log_file_size 
    這個值定義了日誌文件的大小,innodb日誌文件的作用是用來保存redo日誌。一個事務對於數據或索引的修改往往對應到表空間中的隨機的位置,因此當刷新這些修改到磁盤中就會引起隨機的I/O,而隨機的I/O往往比順序的I/O更加昂貴的開銷,因爲隨機的I/O需要更多的開銷來定位到指定的位置。


innodb使用日誌來將隨機的I/O轉爲順序的I/O,只要日誌文件是安全的,那麼事務就是永久的,儘管這些改變還沒有寫到數據文件中,如果出現了當機或服務器斷電的情況,那麼innodb也可以通過日誌文件來恢復以及提交的事務。但是日誌文件是有一定的大小的,所以必須要把日誌文件記錄的改變寫到數據文件中,innodb對於日誌文件的操作是循環的,即當日志文件寫滿後,會將指針重新移動到文件開始的地方重新寫,但是它不會覆蓋那些還沒有寫到數據文件中的日誌,因爲這是唯一記錄了事務持久化的記錄。

問題:對於再一次循環寫滿的日誌組在進行寫入的時候,不覆蓋麼?或者,存在Oracle那樣的歸檔模式?

innodb使用一個後臺的線程來刷新日誌中的記錄到數據文件中,這個線程可以合併寫操作來使之變成順序I/O來提高效率。innodb可以設置多個日誌文件,而日誌文件的總的大小就是所有日誌文件加起來的總大小,而innodb對這些日誌文件的處理相當於一個日誌文件,使用循環的方式來操作,就是當一個日誌文件寫滿以後,纔會將後續的記錄寫到下一個日誌文件,當所有的日誌文件都寫滿後,innodb就會從頭開始寫。mysql中默認的日誌文件爲2個5M的文件這對於壓力大的情況下是遠遠不夠的,那我們怎麼樣來修改日誌文件的大小呢?在重啓mysql服務之前,首先將日誌文件刪除,然後修改配置文件中的日誌文件的大小,然後執行重啓的操作,在重啓的過程中,mysql會重新創建指定大小的日誌文件。

innodb的日誌文件也是保存在磁盤中的,那寫的速度也是相對慢的,innodb中使用了日誌緩存來提高寫的速度。innodb會將所有的日誌首先寫到日誌緩存中,然後再通過後臺的一個線程將這這些緩存刷新到磁盤的日誌文件中。那麼innodb是在什麼時候纔將緩存刷新到日誌文件的呢? 
innodb中有一個配置參數來控制這個行爲,innodb_flush_log_at_trx_commit,這個參數可以設置爲3個不同的值:


  • 在事務提交時不執行任何操作,innodb的後臺線程會每秒執行一次刷新操作 
  • 1
    事務的每一次提交,innodb都會將日誌緩存中的數據刷新到日誌文件(這是mysql對innodb默認的設置,也是最安全的設置) 

  • 事務的每一次提交,innodb都會把日誌緩存中的數據刷新到磁盤,但是不執行flush的操作(即只寫到操作系統的緩存中),這個值跟0的區別爲,這個操作在服務崩潰會其他異常情況下不會丟失任何的事務 

但是還有一個問題就是innodb如何將日誌緩存刷新到日誌文件?這個問題將在接下來的文章中跟大家分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章