官方文档描述如下:

By default, InnoDB uses the fsync()system call to flush both the data and log files. If

innodb_flush_method option is set to O_DSYNC, InnoDB uses O_SYNC to open and flush the

log files, and fsync()to flush the data files. If O_DIRECT is specified (available on some GNU/

Linux versions, FreeBSD, and Solaris), InnoDBuses O_DIRECT(or directio()on Solaris) to

open the data files, and uses fsync()to flush both the data and log files. Note that InnoDB uses

fsync() instead of fdatasync(), and it does not use O_DSYNC by default because there have

been problems with it on many varieties of Unix.

innodb_flush_method

常规3个值

1、fdatasync

2、O_DSYNC

3、O_DIRECT

正常的访问方式

用户态缓存---》内核态缓存---》磁盘

按照MYSQL的描述

1、fdatasync

InnoDB uses the fsync() system call to flush both the data and log files.

Note that InnoDB uses fsync() instead of fdatasync()

虽然MYSQL可以使用fdatasync为参数但是实际上是调用的系统的 fsync()函数,

我们可以看看LINUX下FSYNC()函数的描述

fsync()  transfers  ("flushes") all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the

file descriptor fd to the disk device (or other permanent storage device) so that all changed information can be retrieved  even

after  the  system crashed or was rebooted.  This includes writing through or flushing a disk cache if present.  The call blocks

until the device reports that the transfer has completed.  It also flushes metadata information associated with  the  file  (see

stat(2)).

简单的说这个参数用于同步所有线程修改过的文件,而进程中的PCB中记录了打开文件,他是通过文件描述符进行匹配的

在LINUX内核中/usr/src/linux-headers-3.19.0-25-generic/include/linux/sched.h

有如下的PCB结构体

struct task_struct { }

其中有一个files_struct的结构体,而文件描述符就是这样一个结构体的指针

那么只要MYSQL线程进行了刷新动作,那么他的这些文件的数据一定会同步到磁盘

2、O_DSYNC

InnoDB uses O_SYNC to open and flush the log files, and fsync()to flush the data files

当设置为这个选项的时候,当MYSQL线程打开LOGFILE的时候使用的O_SYNC的方式,而对数据文件还是使用的fsync()

我们知道对一个文件进行读,打开是使用LINUX的

open()函数,而其中也就有这样一个选项

O_SYNC The  file  is  opened for synchronous I/O.  Any write(2)s on the resulting file descriptor will block the calling process

until the data has been physically written to the underlying hardware.

他描述的是如果这样打开一个文件那么在数据从内核态缓存写到了物理磁盘前,任何试图修改文件描述符的进程都会被堵塞。如此保证了日志文件

最大的安全性

3、O_DIRECT

If O_DIRECT is specified (available on some GNU/Linux versions, FreeBSD, and Solaris), InnoDB

uses O_DIRECT(or directio()on Solaris) to open the data files, and uses

fsync()to flush both the data and log files.

使用这个选项MYSQL使用O_DIRECT方式打开数据文件,而fsync()会最终同步所有的数据和日志文件。

我们同样看看open()函数中关于O_DIRECT描述

O_DIRECT (Since Linux 2.4.10)

Try to minimize cache effects of the I/O to and from this file.  In general this will degrade performance, but it is use‐

ful  in special situations, such as when applications do their own caching.  File I/O is done directly to/from user-space

buffers.  The O_DIRECT flag on its own makes an effort to transfer data synchronously, but does not give  the  guarantees

of  the  O_SYNC flag that data and necessary metadata are transferred.  To guarantee synchronous I/O, O_SYNC must be used

in addition to O_DIRECT.

使用这个选项一般来说会降低性能,但是在特定的情况下比如应用程序有自己的缓存机制。I/O直接来自用户态的缓存,O_DIRECT标识对大量的

数据写有利,因为他绕开了内核态缓存,但是他并同步METADATA(这里占时理解为INODE缓存,也就是文件的基本信息比如打开时间修改时间等)

所以要完成同步必须同时调用O_SYNC。

如此我们也了解为什么为什么使用O_DIRECT还会调用FSYNC()我们知道FSYNC()是全同步的,LINUX上的传统的FDATASYNC()是不同步METADATA的

如INODE缓存,进程描述缓存。但是他能够对大量的数据绕开缓存,提高性能,需要最后同步的只是DATAFILE的METADAT。

MYSQL有自己的缓冲,这种可以使用O_DIRECT比较好

水平有限,如有错误请指出

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-1980262/,如需转载,请注明出处,否则将追究法律责任。

mysql innodb flush method_对innodb_flush_method的一点解释相关推荐

  1. 针对 MySQL/InnoDB 刷盘调优

    原文 https://www.percona.com/blog/2020/05/14/tuning-mysql-innodb-flushing-for-a-write-intensive-worklo ...

  2. 从一个死锁看mysql innodb的锁机制

    2019独角兽企业重金招聘Python工程师标准>>> 背景及现象 线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作.经过DBA的分析,是某一张表的inse ...

  3. 浅析MySQL InnoDB的隔离级别

    前言 还是老规矩,首先提出两个待解决的问题: MySQL InnoDB存储引擎中事务的隔离级别有哪些? 对应隔离级别的实现机制是什么? 本文就将对上面这两个问题进行解答,分析事务的隔离级别以及相关锁机 ...

  4. mysql索引列是锁表还是锁行_[转]关于MYSQL Innodb 锁行还是锁表

    关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 做项目时由于业务逻辑的需要,必须 ...

  5. MySQL - InnoDB特性 - Buffer Pool漫谈

    转载自  MySQL - InnoDB特性 - Buffer Pool漫谈 缓存管理是DBMS的核心系统,用于管理数据页的访问.刷脏和驱逐:虽然操作系统本身有page cache,但那不是专门为数据库 ...

  6. MySQL InnoDB Memcached Plugin在Oray公司的实践

    1.应用背景介绍 我所在职的Oray是一家提供各种互联网服务且具有海量用户的企业,我们也一直在实践各种新技术新架构:缓存方面,我们从memcached.ttserver.redis等都有较多应用,其中 ...

  7. mysql innodb隔离级别_浅析MySQL InnoDB的隔离级别

    本文就将对上面这两个问题进行解答,分析事务的隔离级别以及相关锁机制. 隔离性简介 隔离性主要是指数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行,意思 ...

  8. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解...

    2019独角兽企业重金招聘Python工程师标准>>> MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何 ...

  9. 详解 MySql InnoDB 中意向锁的作用

    2019独角兽企业重金招聘Python工程师标准>>> 详解 MySql InnoDB 中意向锁的作用 前言 InnoDB 支持多粒度锁(multiple granularity l ...

最新文章

  1. stm32f302实现斩波控制步进电机_什么是步进电机控制器?
  2. 这样就能用MathType编辑^符号
  3. Java实现从Html文本中提取纯文本
  4. python三十三节_第三十三节,sys解释器相关模块
  5. Vue用Cordova打包后的app自升级功能实现
  6. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)
  7. 放大镜_小学科学实验器材使用规范之放大镜
  8. oracle hint 谓词推进,SQL Hint都无法解救DB性能时,如何通过视图曲线救国?
  9. 使用Beautiful Soup 中遇到的小问题-----只能提取网页上第一页信息
  10. Oracle使用exp导出命令备份数据库
  11. 黑月MySQL_易语言黑月编译器插件
  12. vue模板字符串标签动态参数_vue模板字符串
  13. 操作系统 进程 学习以及思考
  14. QC4+充电协议_坚果R1原装QC4+充电器评测:兼容USB PD3.0/PPS/QC3.0
  15. 用webBrowser打开网页出现脚本错误怎么办?
  16. 关于namecheap 域名运营商,域名赎回详细步骤
  17. 电子密码锁程序C语言,基于C语言STC89C52单片机电子密码锁的系统设计与仿真
  18. RV32I 基本指令集汇编解析
  19. 码元速率估计-速率信号法
  20. cuda官网下载,本机显卡驱动与cuda、cudnn、pytorch、torchvision安装版本对应表,以及完全卸载CUDA方法

热门文章

  1. 用python随机生成5000个网址_使用Python脚本生成随机IP的简单方法
  2. python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...
  3. elementui表格中tip设置_VUE2.0+ElementUI2.0表格el-table:表头扩展el-tooltip
  4. linux kvm安装win7,详解在 KVM 上安装 Win7 虚拟机
  5. vmware网络桥接模式无法上网的解决办法
  6. 工业级以太网交换机产品特征及应用案例介绍
  7. 【渝粤题库】广东开放大学 英语语法与基础写作 形成性考核 (2)
  8. 【渝粤题库】陕西师范大学152108 电子政务理论与实践 作业(高起专)
  9. 分数化简_分数应用题七讲 (一) 图示法解分数应用题
  10. python设计模式有哪些_设计模式教程