MySQL数据库服务配置参数-innodb_flush_method

配置参数说明背景

企业应用案例:
在企业实际生产环境中,每天都会进行数据备份操作,利用mysqldump命令完成数据库备份;但是突然发现某天备份数据的时间很长,是平常备份数据时长的好几倍,由原来的几分钟的时间变为了几十分钟才能完成;经过调试排查问题,发现配置文件中的innodb_flush_method = O_DIRECT参数信息一旦注释掉,备份时长就大大缩短了;
因此,花了些时间查看网上资料,分析了innodb_flush_method参数的作用功能。

配置参数功能概述

innodb_flush_method配置参数可以控制innodb引擎对数据文件与redo log文件的打开、刷写模式;
其中包括以下三种配置选项:fdatasync(默认),O_DSYNC,O_DIRECT;

序号 选项 解释说明
01 fdatasync(默认) 会调用fsync()函数, 去刷新数据文件与redolog的buffer
02 O_DSYNC 会使用O_SYNC方式,打开和刷写redo log
会使用fsync()函数,去刷写数据文件
03 O_DIRECT 会使用O_DIRECT方式,打开数据文件
会使用fsync()函数,去刷写数据文件跟redo log

在对以上三个配置选项深入理解之前,我们首先需要明白文件进行写操作时,包含的三个步骤:open、write、flush
· fsync()模式
在数据库服务中,进行数据存储操作时经常提到fsync(int fd)函数,该函数作用是flush操作时,会将与文件描述符(fd)所指文件有关的buffer刷写到磁盘,并且flush完成元数据信息(eg:修改日期 创建日志等属性信息)才算flush成功。
写数据时,write这一步并不需要真正写到磁盘才算完成,可能写入到操作系统buffer中就会返回完成,真正完成磁盘写入数据是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。

· O_DSYNC方式
使用O_SYNC方式打开redo文件表示当write日志时,数据都write到磁盘,并且元数据也需要更新,才返回成功
写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成

· O_DIRECT方式
表示对于数据的write操作是从mysql innodb buffer里直接向磁盘上写
数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而redo log也是在flush这步,日志还是要经过OS缓冲

官方建议:
通常来说,linux环境下具有raid控制器和write-back写策略,o_direct是比较好的选择;如果存储介质是SAN,那么使用默认fsync或者osync或许更好一些。


参考资料链接:
· https://blog.csdn.net/h106140873/article/details/125701485

posted @ 2022-12-12 15:15  aiweiwei24  阅读(452)  评论(0)    收藏  举报