mysql innodb學習(二)

以前的一篇簡單介紹了innodb_buffer_pool_size的做用,下面接下來和你們分享一下innodb的日誌文件相關的參數的做用。mysql

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

innodb使用日誌來將隨機的I/O轉爲順序的I/O,只要日誌文件是安全的,那麼事務就是永久的,儘管這些改變尚未寫到數據文件中,若是出現了當機或服務器斷電的狀況,那麼innodb也能夠經過日誌文件來恢復以及提交的事務。可是日誌文件是有必定的大小的,因此必需要把日誌文件記錄的改變寫到數據文件中,innodb對於日誌文件的操做是循環的,即當日志文件寫滿後,會將指針從新移動到文件開始的地方從新寫,可是它不會覆蓋那些尚未寫到數據文件中的日誌,由於這是惟一記錄了事務持久化的記錄。sql

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

innodb的日誌文件也是保存在磁盤中的,那寫的速度也是相對慢的,innodb中使用了日誌緩存來提升寫的速度。innodb會將全部的日誌首先寫到日誌緩存中,而後再經過後臺的一個線程將這這些緩存刷新到磁盤的日誌文件中。那麼innodb是在何時纔將緩存刷新到日誌文件的呢? innodb中有一個配置參數來控制這個行爲,innodb_flush_log_at_trx_commit,這個參數能夠設置爲3個不一樣的值:安全

  • 0 在事務提交時不執行任何操做,innodb的後臺線程會每秒執行一次刷新操做服務器

  • 1 事務的每一次提交,innodb都會將日誌緩存中的數據刷新到日誌文件(這是mysql對innodb默認的設置,也是最安全的設置)操作系統

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

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

相關文章
相關標籤/搜索