我有一组文件(每个大约20MB)需要插入到mysql的表中。插入是在所有文件的循环中完成的(单线程)。这通常很好,但我不时会得到以下异常:File '.table.MYD' not found (Errcode: 13)
对于集合中间的一个文件(前50个运行正常,接下来2-3个将失败,然后以下将运行再次罚款)。如果我只是重新运行mysql workbench中失败文件的查询(或重新运行失败的文件),它们工作正常。该表刚刚创建,没有索引 - 所以“索引失败”,表碎片或任何其他问题等问题不应该存在。
以下是完整的堆栈跟踪:
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-are-thrown',但我强烈认为这不是正确的解决方案。
任何想法是什么,以及如何一劳永逸地解决这个问题?
UPDATE - 很明显,'try-to-insert-while-13error-exception-is-thrown'修复不是一个好的想法:我在运行SELECT时遇到了同样的异常成功插入数据后的表格。
更新2 - 检查了日志,我注意到另一个奇怪的例外:Error on rename of '.\db\table.MYD' to '.\db\#sql2-4e4-1677.MYD' (Errcode: 17)
......事情正在好转......
答案 0 :(得分:0)