MyISAM表文件不存在

本文关键字:不存在 文件 MyISAM | 更新日期: 2023-09-27 17:53:23

我有一组文件(每个大约20MB)需要插入到mysql中的表中。所有文件的插入都是在一个循环中完成的(单线程)。这通常工作得很好,但有时我得到以下异常:File '.table.MYD' not found (Errcode: 13)在集合中间的一个文件(前50运行正常,接下来的2-3将失败,然后接下来的将再次运行良好)。如果我只是在mysql工作台中重新运行失败文件的查询(或重新运行失败的文件),它们工作得很好。表是刚刚创建的,没有索引,所以像"索引失败"、表碎片或任何其他问题不应该存在。

下面是完整的堆栈跟踪:
File '.dbtable.MYD' not found (Errcode: 13)
----------------------------------
 at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
 at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
 at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
 at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
 at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
 at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
 at Utils.SqlUtils.ExecMysql(String sql, String connection)
 at Utils.MySqlExecQueue.DoExec(Object data)
----------------------------------
MySql.Data

地点:
+ ExecMysql -看起来像

using (MySqlConnection cnn = new MySqlConnection(connection))
{
  cnn.Open();
  using (MySqlCommand cmd = new MySqlCommand(sql, cnn))
  {
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
  }
}

+ DoExec是从队列中取出文件,创建sql语句并调用上面的ExecMysql的方法。+插入代码和mysql在同一台机器上(Windows 2008, x64);
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *+ c# (.net 4)代码使用的是mysql连接器6.5.4,mysql版本是5.5;

我已经实现了一个虚拟的解决方案,如'try-to-insert-while-13error-exception-is-thrown',但我有一种强烈的感觉,这不是正确的解决方案。

知道发生了什么事,如何一劳永逸地解决这个问题吗?

UPDATE -显然,'try-to-insert-while-13error-exception-is-thrown'修复不是一个好主意:我刚刚在成功插入数据后对表运行SELECT时得到了相同的异常。

UPDATE 2 -检查日志,我注意到另一个奇怪的异常:Error on rename of '.'db'table.MYD' to '.'db'#sql2-4e4-1677.MYD' (Errcode: 17)…情况正在好转……

MyISAM表文件不存在

你们有杀毒软件吗?如果是,确保mysql目录和它的临时文件夹从AV中排除,然后再试一次。