0

我有一组文件(每个大约 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-throw”,但我强烈认为这不是正确的解决方案。

任何想法发生了什么以及如何一劳永逸地解决这个问题?

更新- 显然,'try-to-insert-while-13error-exception-is-throw' 修复不是一个好主意:我在成功插入数据后立即在表上运行 SELECT 时遇到了同样的异常。

更新 2 - 检查了日志,我注意到另一个奇怪的异常:Error on rename of '.\db\table.MYD' to '.\db\#sql2-4e4-1677.MYD' (Errcode: 17)......事情正在变得更好......

4

1 回答 1

0

你有什么杀毒软件吗?如果是这样,请确保 mysql 目录及其临时文件夹从 AV 中排除,然后重试。

于 2013-01-14T09:14:00.677 回答