阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

innodb_flush_method 深入理解

107次阅读
没有评论

共计 1128 个字符,预计需要花费 3 分钟才能阅读完成。

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 log

首先文件的写操作包括三步:open,write,flush

上面最常提到的 fsync(int fd)函数,该函数作用是 flush 时将与 fd 文件描述符所指文件有关的 buffer 刷写到磁盘,并且 flush 完元数据信息 (比如修改日期、创建日期等) 才算 flush 成功。

使用 O_SYNC 方式打开 redo 文件表示当 write 日志时,数据都 write 到磁盘,并且元数据也需要更新,才返回成功

O_DIRECT 则表示我们的 write 操作是从 mysql innodb buffer 里直接向磁盘上写

至此我再总结一下三者写数据方式:

fdatasync 模式:写数据时,write 这一步并不需要真正写到磁盘才算完成(可能写入到操作系统 buffer 中就会返回完成),真正完成是 flush 操作,buffer 交给操作系统去 flush, 并且文件的元数据信息也都需要更新到磁盘。

O_DSYNC 模式:写日志操作是在 write 这步完成,而数据文件的写入是在 flush 这步通过 fsync 完成

O_DIRECT 模式:数据文件的写入操作是直接从 mysql innodb buffer 到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在 flush 这步, 日志还是要经过 OS 缓冲

innodb_flush_method 深入理解

注:在类 unix 操作系统中,文件的打开方式为 O_DIRECT 会最小化缓冲对 io 的影响,该文件的 io 是直接在用户空间的 buffer 上操作的,并且 io 操作是同步的,因此不管是 read()系统调用还是 write()系统调用,数据都保证是从磁盘上读取的;O_SYNC 方式表示以同步 io 的方式打开文件,任何写操作都将阻塞到数据写入物理磁盘后才返回。fsync(int filedes)函数只对由文件描述符 filedes 指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fdatasync(int filedes)函数类似于 fsync,但它只影响文件的数据部分。而除数据外,fsync 还会同步更新文件的元信息到磁盘。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/148132.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1128字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中