MySQL表'/tmp/#.....MYI'的密钥文件不正确;尝试修复它

时间:2014-10-16 13:59:30

标签: mysql debian innodb myisam

我们使用Entity Framework和MySQL Connector在.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)

这里有关于stackoverflow和goole,我看到几个帖子有相同的&#34;错误&#34;。其中大多数与临时分区上的可用空间有关。但是当我查看数据库服务器时,/ tmp分区仅用于3%并且有足够的可用空间。

我跟踪了导致这些错误消息的查询,但我现在可以执行查询。我没有看到临时驱动器/分区的任何用法。查询的表非常小,每个表只有几千行(但我们在外键上加入4个表)。 这给我带来了下一件事,我们在大多数表中使用InnoDB表。只有4个表使用MyIsam结构。这些表确实包含大量数据(每个表大约10gb)。但目前查询(和实体框架上下文)并没有涉及这些表格。

它可以与备份或某个特定时刻运行的东西有关吗?有人知道InnoDb和MyIsam表使用临时存储进行某些查询,因此查询InnoDb表会发生此错误吗?

1 个答案:

答案 0 :(得分:0)

原因:

当/ tmp挂载点出现磁盘空间问题时会发生这种情况。 MySQL查询创建临时MyISAM表以完成执行和获取结果。现在,临时MyISAM表一般是在 --tmpdir 上创建的,如 my.cnf 中所述。通常 / tmp 如果未明确配置。如果发生错误,我们可能看不到空间不足。我们需要在执行查询期间检查/ tmp目录的空间

决议:

  1. 增加/ tmp目录的大小

  2. 调整查询,使其无需创建任何&#39; / tmp /#.. MYI&#39;。特别避免UNION,ORDER BY等

  3. 改变MySQL配置,例如sort_buffer_sizejoin_buffer_sizequery_cache_size,最重要的是tmp_table_size

  4. 将--tmpdir路径更改为除默认/ tmp目录以外的其他位置,其中有更多可用空间

  5. <强>参考:

    http://kakadba.blogspot.in/2016/05/mysql-incorrect-key-file-for-table.html