Mysql 在Linux上使用 innodb_flush_method = O_DIRECT_NO_FSYNC 安全吗?

2023年 9月 13日 50.7k 0

在MySQL 5.6和更高版本中,可以设置innodb_flush_method = O_DIRECT_NO_FSYNC。对于某些工作负载,这可以提供比O_DIRECT更好的写入吞吐量。

但是,在MySQL 5.7.25和8.0.14之前,由于Linux的一个bug,Linux上的任何文件系统使用O_DIRECT_NO_FSYNC并不安全。

使用O_DIRECT_NO_FSYNC当InnoDB数据文件更改大小时,可能会导致操作系统停止,因为文件系统元数据可能会不同步。请参见BUG 27309336。

MySQL 5.7.25和8.0.14中已经实现了该错误的解决方法并进行了优化。

在MySQL 5.7.25/ 8.0.14之前,此设置不适合XFS和EXT4等文件系统,它们需要fsync()系统调用来同步文件系统元数据的更改。如果您不确定您的文件系统是否需要fsync()系统调用来同步文件系统元数据更改,请使用O_DIRECT。

从MySQL 8.0.14开始,在创建新文件、增加文件大小和关闭文件之后,会调用fsync(),以确保文件系统元数据的更改是同步的。每次写其他的操作之后,fsync()系统调用仍然被跳过。

如果重做日志文件和数据文件驻留在不同的存储设备上,则可能会丢失数据,并且在从没有电池供电的设备缓存中刷新数据文件写入之前,会发生意外退出。如果您对重做日志文件和数据文件使用或打算使用不同的存储设备,并且您的数据文件驻留在具有非电池供电的缓存的设备上,请改用O_DIRECT。

总结:​

1.​在MySQL 5.7.25和8.0.14之前 ,使用 innodb_flush_method = O_DIRECT

2.在MySQL 5.7.25和8.0.14之后,使用 innodb_flush_method = O_DIRECT_NO_FSYNC

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论