GreatSQL社区

搜索

chongzh

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

chongzh 已有 324 次阅读2023-9-13 23:07 |个人分类:Mysql 原理|系统分类:原理&产品解读

在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


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-5-2 19:12 , Processed in 0.013102 second(s), 8 queries , Redis On.
返回顶部