MySQL创建全文索引时,遇到“Temporary file write failure”的错误

在MySQL8.0.28版本中,遇到创建全文索引时的Temporaryfilewritefailure错误,问题由innodb_disable_sort_file_cache参数为ON的bug引起。即使磁盘空间充足且无权限问题,该bug也会阻止全文索引创建。解决方案是将innodb_disable_sort_file_cache设为OFF。
摘要由CSDN通过智能技术生成

MySQL创建全文索引时,遇到“Temporary file write failure”的错误

环境信息

MySQL Version: 8.0.28
engine: InnoDB
rows: 100
index length: 10MB
data length: 30MB

笔者在MYSQL上执行创建添加全文索引的语句:alter table users add fulltext index idx_name(name)时报错。

Temporary file write failure

错误表示 MySQL 发生了临时文件写入失败的错误。这种错误通常发生在 MySQL 尝试将临时数据写入磁盘时遇到问题。

MySQL在创建全文索引的过程中,涉及将文本数据进行分词、建立索引结构和排序等操作。这些操作可能需要处理大量的中间数据,因此可能需要使用临时文件来存储和处理这些数据。这些临时文件通常存储在配置的临时文件目录中(通过tmpdir参数配置)。

而上面的错误可能有以下几个原因和解决方法:

  • 磁盘空间不足:检查磁盘空间是否充足,确保有足够的可用空间供 MySQL 写入临时文件。如果磁盘空间不足,可以清理磁盘上的不必要文件或扩大磁盘容量。

  • 文件系统权限问题:确保 MySQL 进程有足够的权限向指定的目录写入临时文件。检查临时文件存储目录的权限设置,并确保 MySQL 用户具有写入权限。

  • 文件系统错误或损坏:如果文件系统本身存在问题,可能会导致临时文件写入失败。在这种情况下,可以尝试修复文件系统或更换存储介质。

  • 其他系统级问题:临时文件写入失败可能是由于其他系统级问题引起的,例如磁盘故障、操作系统错误等。在这种情况下,建议检查系统日志以获取更多详细信息。

但是一一排查过后,发现不是上述问题。

首先表很小,只有30MB,磁盘仍有200G剩余空间,所以不是磁盘空间不足的问题,并且数据库上正常的写入和查询都是正常,所以也排除权限和文件系统损坏的问题。所以问题是什么呢?

后面经过一番排查,发现是mysql这个版本(MySQL 8.0.28, 8.0.32 )的bug导致的,我们可以找到这个bug链接 。

文档中提到,当innodb_disable_sort_file_cache为ON时,无法在表上创建全文索引,错误提示:临时文件写入失败。

When starting mysqld and using innodb_disable_sort_file_cache=ON, we will fail to create a full-text index on the table. The error message: Temporary file write failure> When this error occurs, the disk still has a lot of space. The reason for this error is that when innodb_disable_sort_file_cache=ON, during the process of parsing DDL, fail to write 25 bytes to temporary file.

MySQL 的验证团队已经验证了该 Bug 并对其进行了确认。目前该 Bug 的状态为 "Verified"。

我们可以通过将innodb_disable_sort_file_cache设置为OFF,暂时规避这个问题。

innodb_disable_sort_file_cache参数的含义

Disables the operating system file system cache for merge-sort temporary files. The effect is to open such files with the equivalent of O_DIRECT.

为合并排序临时文件禁用操作系统文件系统缓存。其效果类似使用O_DIRECT打开文件。

默认情况下,innodb_disable_sort_file_cache 的值为 OFF,表示排序文件缓存是启用的。这意味着 InnoDB 存储引擎会尝试在内存中缓存排序操作的临时文件数据。

如果将 innodb_disable_sort_file_cache 设置为ON,则表示禁用排序文件缓存。这将导致排序操作的临时文件直接写入磁盘,而不使用内存缓存。禁用排序文件缓存可能会增加磁盘 I/O 操作,但在某些情况下也可能对性能有所改进,特别是当排序操作使用的内存超过了可用的排序文件缓存大小时。

O_DIRECT 是一个文件打开标志(flag),在 Linux 系统中用于直接 I/O 操作。它告诉操作系统绕过文件系统缓存,直接在应用程序和磁盘之间进行数据传输。

总结

MySQL 8.0.28、8.0.32版本bug,当innodb_disable_sort_file_cache为ON时,无法在表上创建全文索引,错误提示:临时文件写入失败。 我们可以通过将innodb_disable_sort_file_cache设置为OFF,暂时规避这个问题。

更多有关全文索引内容,可查看笔者之前的文章:

mysql之全文索引二三事

mysql之全文索引二三事

参考:
https://bugs.mysql.com/bug.php?id=110557&thanks=4
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

图片

点个“赞 or 在看” 你最好看!

喜欢,就关注我吧!

图片

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值