MySQL根据5.1.34之前版本的一个BUG分析O_DIRECT

Mysql错误日志:

Version:  '5.1.34-percona-highperf-log'  socket:  '/home/mysql/mysql.sock'  port:  3306  Source distribution
140324  5:00:02  InnoDB: Failed to set O_DIRECT on file  /tmp/#sql593e_191_0.ibd: CREATE: Invalid argument, continuing anyway
140324  5:00:02  InnoDB: O_DIRECT is known to result in  'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662
140324  5:00:02  InnoDB: Failed to set O_DIRECT on file  /tmp/#sql593e_191_0.ibd: OPEN: Invalid argument, continuing anyway
140324  5:00:02  InnoDB: O_DIRECT is known to result in  'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662
140324  5:00:02  InnoDB: Failed to set O_DIRECT on file  /tmp/#sql593e_192_0.ibd: CREATE: Invalid argument, continuing anyway
140324  5:00:02  InnoDB: O_DIRECT is known to result in  'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662
140324  5:00:02  InnoDB: Failed to set O_DIRECT on file  /tmp/#sql593e_192_0.ibd: OPEN: Invalid argument, continuing anyway
140324  5:00:02  InnoDB: O_DIRECT is known to result in  'Invalid argument' on Linux on tmpfs, see MySQL Bug#26662

innodb_flush_method 这个参数控制着innodb数据文件及redo log的打开、刷写模式。对于这个参数,文档上是这样描述的:

从MySQL 5.6的版本开始,也就是InnoDB 1.2版本中(PS:MariaDB 10.x版本将集成InnoDB 1.2版本),对于参数innodb_flush_method提供了一个新的设置值O_DIRECT_NO_FSYNC。

有四个值:fdatasync,O_DSYNC,O_DIRECT,O_DIRECT_NO_FSYNC

  • 默认是fdatasync,调用fsync()去刷数据文件与redo log的buffer
  • 为O_DSYNC时,innodb会使用O_SYNC方式打开和刷写redo log,使用fsync()刷写数据文件
  • 为O_DIRECT时,innodb使用O_DIRECT打开数据文件,使用fsync()刷写数据文件跟redo log
  • 为O_DIRECT_NO_FSYNC时,InnoDB存储引擎将依然使用O_DIRECT选项打开数据表空间文件,但是在刷新时,不再需要需要额外的fsync操作

首先文件的写操作包括三步: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缓冲

优点:

  1. 目前都是硬盘如SSD、F/M卡 IO已经很快了,无需再利用系统缓存。
  2. 最为安全和稳妥的做法还是将参数innodb_flush_method设置为O_DIRECT。
  3. 若重做日志使用O_DIRECT,写入重做日志文件的过程会变慢(因为不是仅写入到操作系统缓存),Group Commit的效率就会变差。

原文发布于微信公众号 - MYSQL轻松学(learnmysql)

原文发表时间:2016-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6848
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2182
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5476
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4025
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4728
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2968
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4888
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3145
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2536
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7

扫码关注云+社区