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之全文索引二三事
参考:
https://bugs.mysql.com/bug.php?id=110557&thanks=4
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html
点个“赞 or 在看” 你最好看!
喜欢,就关注我吧!