mysql innodb的學習(二)
之前的一篇簡單介紹了innodbbufferpool_size的作用,下面接下來和大家分享一下innodb的日志文件相關的參數的作用。 www.2cto.com
innodblogfile_size 這個值定義了日志文件的大小,innodb日志文件的作用是用來保存redo日志。一個事務對於數據或索引的修改往往對應到表空間中的隨機的位置,因此當刷新這些修改到磁盤中就會引起隨機的I/O,而隨機的I/O往往比順序的I/O更加昂貴的開銷,因為隨機的I/O需要更多的開銷來定位到指定的位置。
innodb使用日志來將隨機的I/O轉為順序的I/O,只要日志文件是安全的,那麼事務就是永久的,盡管這些改變還沒有寫到數據文件中,如果出現了當機或服務器斷電的情況,那麼innodb也可以通過日志文件來恢復以及提交的事務。但是日志文件是有一定的大小的,所以必須要把日志文件記錄的改變寫到數據文件中,innodb對於日志文件的操作是循環的,即當日志文件寫滿後,會將指針重新移動到文件開始的地方重新寫,但是它不會覆蓋那些還沒有寫到數據文件中的日志,因為這是唯一記錄了事務持久化的記錄。
innodb使用一個後台的線程來刷新日志中的記錄到數據文件中,這個線程可以合並寫操作來使之變成順序I/O來提高效率。innodb可以設置多個日志文件,而日志文件的總的大小就是所有日志文件加起來的總大小,而innodb對這些日志文件的處理相當於一個日志文件,使用循環的方式來操作,就是當一個日志文件寫滿以後,才會將後續的記錄寫到下一個日志文件,當所有的日志文件都寫滿後,innodb就會從頭開始寫。
mysql中默認的日志文件為2個5M的文件,這對於壓力大的情況下是遠遠不夠的,那我們怎麼樣來修改日志文件的大小呢?在重啟mysql服務之前,首先將日志文件刪除,然後修改配置文件中的日志文件的大小,然後執行重啟的操作,在重啟的過程中,mysql會重新創建指定大小的日志文件。
innodb的日志文件也是保存在磁盤中的,那寫的速度也是相對慢的,innodb中使用了日志緩存來提高寫的速度。innodb會將所有的日志首先寫到日志緩存中,然後再通過後台的一個線程將這這些緩存刷新到磁盤的日志文件中。那麼innodb是在什麼時候才將緩存刷新到日志文件的呢? innodb中有一個配置參數來控制這個行為,innodbflushlogattrx_commit,這個參數可以設置為3個不同的值:
0 在事務提交時不執行任何操作,innodb的後台線程會每秒執行一次刷新操作
1 事務的每一次提交,innodb都會將日志緩存中的數據刷新到日志文件(這是mysql對innodb默認的設置,也是最安全的設置)
2 事務的每一次提交,innodb都會把日志緩存中的數據刷新到磁盤,但是不執行flush的操作(即只寫到操作系統的緩存中),這個值跟0的區別為,這個操作在服務崩潰會其他異常情況下不會丟失任何的事務
但是還有一個問題就是innodb如何將日志緩存刷新到日志文件?這個問題將在接下來的文章中跟大家分享。