在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