2014-10-16 76 views
0

我们使用实体框架和MySQL连接器在.Net中编写了一个应用程序。但有时查询无法在应用程序中执行,我们不知道为什么。数据库安装在Debian服务器上。MySQL错误的表'/tmp/#.....MYI'的密钥文件;尝试修复它

我们在日志文件瑟以下消息:

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) 

这里的计算器,并在古尔,我看到几个帖子用相同的“错误”。它们中的大多数与临时分区上的可用空间有关。但是当我查看数据库服务器时,/ tmp分区仅用于3%,并具有足够的可用空间。

我追溯了导致这些错误消息的查询,但我现在可以执行查询。我没有看到临时驱动器/分区的任何用法。另外,查询的表格非常小​​,每个表只有几千行(但我们在外键上连接了4个表)。 这给我带来了下一个问题,我们在大多数表中使用InnoDB表。只有4个表使用MyIsam结构。这些表包含大量数据(每个表大约10GB)。但是目前查询(和实体框架上下文)未触及这些表。

它可以与备份或某个特定时刻运行有关吗?并且有人知道InnoDb和MyIsam表为某些查询使用临时存储,以便通过查询InnoDb表可以发生此错误?

+0

可能出现[进行多个连接时tmp表的MySQL错误密钥文件](https:// stackoverflow。COM /问题/ 2090073/MySQL的,不正确密钥文件换-TMP的表时,制作海报联接) – 2018-03-01 09:19:36

回答

0

原因:

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

分辨率期间检查/ tmp目录下的空间:

  1. 增加/ tmp目录

  2. 调查询的大小,这样的方式它不需要创建任何'/tmp/#..MYI'。特别是避免UNION,ORDER BY等

  3. 阿尔特MySQL配置如sort_buffer_sizejoin_buffer_sizequery_cache_size,最重要的tmp_table_size

  4. 更改--tmpdir路径别的地方,从那里是缺省的/ tmp目录分开更多的自由空间

参考:

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

相关问题