MySQL 表 '/tmp/#.....MYI' 的密钥文件不正确;尝试修复它
Posted
技术标签:
【中文标题】MySQL 表 \'/tmp/#.....MYI\' 的密钥文件不正确;尝试修复它【英文标题】:MySQL Incorrect key file for table '/tmp/#.....MYI'; try to repair itMySQL 表 '/tmp/#.....MYI' 的密钥文件不正确;尝试修复它 【发布时间】:2014-12-11 22:27:29 【问题描述】:我们使用实体框架和 mysql 连接器在 .Net 中编写了一个应用程序。但有时查询无法在应用程序中执行,我们不知道为什么。该数据库安装在 Debian 服务器上。
我们在日志文件中看到以下消息:
System.Data.EntityCommandExecutionException: Er is een fout opgetreden tijdens het uitvoeren van de opdrachtdefinitie. Zie de interne uitzondering voor details. ---> MySql.Data.MySqlClient.MySqlException: Incorrect key file for table '/tmp/...MYI'; try to repair it
bij MySql.Data.MySqlClient.MySqlStream.ReadPacket()
bij MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
bij MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
bij MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
bij MySql.Data.MySqlClient.MySqlDataReader.NextResult()
bij MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
bij MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
bij System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
bij System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
--- Einde van intern uitzonderingsstackpad ---
bij System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
bij System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
bij System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
bij System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
bij System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
bij System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable`1 sequence)
bij System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
bij System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
bij System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
在 *** 和 goole 上,我看到几个带有相同“错误”的帖子。其中大多数与临时分区上的可用空间有关。但是当我查看数据库服务器时,/tmp 分区仅使用了 3% 并且有足够的可用空间。
我跟踪了导致这些错误消息的查询,但我现在可以执行查询。我没有看到临时驱动器/分区的任何用法。此外,查询的表非常小,每个表只有几 1000 行(但我们确实在外键上连接了 4 个表)。 这给我带来了下一件事,我们对大多数表使用 InnoDB 表。只有 4 个表使用 MyIsam 结构。这些表确实包含大量数据(每个表大约 10gb)。但目前查询(和实体框架上下文)并未触及这些表。
它可能与备份或在某个时刻运行的东西有关吗?是否有人知道 InnoDb 和 MyIsam 表使用临时存储进行某些查询,以便查询 InnoDb 表时会发生此错误?
【问题讨论】:
MySQL incorrect key file for tmp table when making multiple joins的可能重复 【参考方案1】:原因:
当 /tmp 挂载点中存在磁盘空间问题时会发生这种情况。 MySQL 查询会创建一个临时 MyISAM 表来完成执行并获取结果。现在临时 MyISAM 表一般在 --tmpdir 上创建,如 my.cnf 中所述。如果未明确配置,通常为 /tmp。如果发生错误,我们可能看不到空间稀缺。在执行查询的过程中,我们需要检查/tmp目录的空间
分辨率:
增加/tmp目录的大小
调整查询,使其不需要创建任何“/tmp/#..MYI”。特别避免 UNION、ORDER BY 等
更改 MySQL 配置,例如 sort_buffer_size
、join_buffer_size
、query_cache_size
,最重要的是 tmp_table_size
将 --tmpdir 路径更改为默认 /tmp 目录之外的其他位置,那里有更多可用空间
参考:
http://kakadba.blogspot.in/2016/05/mysql-incorrect-key-file-for-table.html
【讨论】:
以上是关于MySQL 表 '/tmp/#.....MYI' 的密钥文件不正确;尝试修复它的主要内容,如果未能解决你的问题,请参考以下文章
得到维度处理错误;表 '/var/tmp/mysql.VArBWG/#sql_aa0_8.MYI' 的密钥文件不正确;尝试修复它
表 '/tmp/#sql_3c51_0.MYI' 的密钥文件不正确;尝试修复它[重复]
编译安装mysql ERROR: 1 Can't create/write to file '/tmp/#sql_86b_0.MYI'
ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_830_0.MYI' (Errcode: 13)
Incorrect key file for table '/tmp/#sql_882_0.MYI'; try to repair it