2014-10-16 32 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

相關問題