mysqlのテーブルに挿入する必要のあるファイルのセット(それぞれ約20MB)があります。挿入は、すべてのファイルに対してループで実行されます(シングルスレッド)。これは通常は正常に機能しますが、次の例外が発生することがあります。File '.table.MYD' not found (Errcode: 13)
セットの途中にある1つのファイルの場合(最初の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-thrown」の修正は適切なアイデアではありません。データが正常に挿入された直後にテーブルでSELECTを実行しているときに、同じ例外が発生しました。
更新2-ログを確認しましたが、別の奇妙な例外に気づきました:Error on rename of '.\db\table.MYD' to '.\db\#sql2-4e4-1677.MYD' (Errcode: 17)
...状況は良くなっています...