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

MySQL 配置参数信息说明~
浙公网安备 33010602011771号