.sql ファイル (550 MB) があり、実行中の mysql サーバーにインポートしたいと考えています。mysql.exe へのパスを知っています。
私の考えは、コマンド ラインの import を模倣することですmysql -u user -ppass db_name < file.sql
。これはコマンド ラインからうまく機能します (max_allowed_packet を高く設定しました)。ここStackoverflowの別のスレッドによると、これが機能していることがわかりました:
Process process = new Process();
process.StartInfo.FileName = mysqlexepath;
process.StartInfo.Arguments = "-v -u user -ppassworddbname";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
try
{
process.Start();
StreamWriter input = process.StandardInput;
using (StreamReader sr = new StreamReader(sqlfilepath))
{
while ((line = sr.ReadLine()) != null)
{
if (process.HasExited == true)
throw new Exception("DB went away.");
input.WriteLine(line);
input.Flush();
}
}
process.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
DBでテーブルが作成されている様子がわかります。しかし、私の問題は、プロセスの約半分が終了することです。いくつかのタイムアウト設定をグーグルで検索しましたが、何も見つかりませんでした。
私も最初にファイルを読み取ろうとしました:
var file = FileInfo(sqlfilepath);
StreamReader reader = file.OpenText();
string fileContents = reader.ReadToEnd();
StreamWriter input = process.StandardInput;
input.AutoFlush = true;
input.Write(fileContents);
input.Close();
しかし、OutOfMemory 例外が発生します。したがって、適切な方法は文字列を通り抜けません。
どこに問題があるのか を調べる方法についてアドバイスをいただければ幸いです。そのプロセスのタイムアウトかmysqlのタイムアウトか、問題がStreamReaderにあるのかさえわかりません。