innodb_flush_method這個參數控制着innodb數據文件及redo log的打開、刷寫模式,對於這個參數,文檔上是這樣描述的:
有三個值:fdatasync(默認),O_DSYNC,O_DIRECT
默認是fdatasync,調用fsync()去刷數據文件與redo log的buffer
爲O_DSYNC時,innodb會使用O_SYNC方式打開和刷寫redo log,使用fsync()刷寫數據文件
爲O_DIRECT時,innodb使用O_DIRECT打開數據文件,使用fsync()刷寫數據文件跟redo logmysql
首先文件的寫操做包括三步:open,write,flush
上面最常提到的fsync(int fd)函數,該函數做用是flush時將與fd文件描述符所指文件有關的buffer刷寫到磁盤,而且flush完元數據信息(好比修改日期、建立日期等)纔算flush成功。
使用O_SYNC方式打開redo文件表示當write日誌時,數據都write到磁盤,而且元數據也須要更新,才返回成功
O_DIRECT則表示咱們的write操做是從mysql innodb buffer裏直接向磁盤上寫sql
至此我再總結一下三者寫數據方式:
fdatasync模式:寫數據時,write這一步並不須要真正寫到磁盤纔算完成(可能寫入到操做系統buffer中就會返回完成),真正完成是flush操做,buffer交給操做系統去flush,而且文件的元數據信息也都須要更新到磁盤。async
O_DSYNC模式:寫日誌操做是在write這步完成,而數據文件的寫入是在flush這步經過fsync完成函數
O_DIRECT模式:數據文件的寫入操做是直接從mysql innodb buffer到磁盤的,並不用經過操做系統的緩衝,而真正的完成也是在flush這步,日誌仍是要通過OS緩衝操作系統