innodb_flush_method理解

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缓冲操作系统

相关文章
相关标签/搜索