【问题标题】:MySQL database backup using C#使用 C# 备份 MySQL 数据库
【发布时间】:2012-12-06 15:40:00
【问题描述】:

我正在尝试备份一个 mysql 数据库。 我创建的代码是

ProcessStartInfo proc = new ProcessStartInfo();
string cmd = string.Format(@"-u{0} -p{1} -E -R -h{2} {3}", UserName, PWD, hostname, dbname);
proc.FileName = "Path to mysqldump.exe";
proc.RedirectStandardInput = false;
proc.RedirectStandardOutput = true;
proc.Arguments = cmd;
proc.UseShellExecute = false;
Process p = Process.Start(proc);
string res;
res = p.StandardOutput.ReadToEnd();
file.WriteLine(res);
p.WaitForExit();
file.Close();

问题是当数据库大小较小时它可以正常工作,但是当我尝试备份大型数据库(大约 800 MB)时我得到Out Of Memory Exception

【问题讨论】:

  • 错误信息解释了很多事情。C盘中有多少空间决定了备份操作的空间,因为在进行备份或任何凝乳内存管理时会使用临时内存。
  • @Pratik 大约有 64 GB 可用空间......
  • 读取数据库文件的方法您可以发布示例,因为这可能是原因

标签: c# mysql mysqldump


【解决方案1】:

为什么不直接通过命令行将其写入文件而不是读取 C# 中的标准输出?

我通常使用以下命令获取我的 mysqldumps。它适用于 Windows 和 Linux。

mysqldump -u{user} -p{password} --routines --triggers --result-file={dest_filename} {dbname}

-或-

mysqldump -u{user} -p{password} --routines --triggers {dbname} > {dest_filename}

您遇到的Out of memory 异常可能是在尝试将mysqldump 的整个输出读取到下一行的C# 中的内存时引起的(通常发生在字符串超过一定大小时)。

res = p.StandardOutput.ReadToEnd();

【讨论】:

  • 谢谢 Tanzeel 让我试试。
  • 我认为 ">" 用于 dos 命令,它给我错误“找不到表 >”
  • @Vijesh 是的,正如我在答案through the command line 中所说的那样。您可以使用--result-file 参数使用第一个建议,也可以通过cmd /c "{command to run}" 运行它。
  • @Rakesh 你能分享代码吗...我也在寻找类似的解决方案
【解决方案2】:

看起来很大的字符串吃掉了内存。

尝试使用 OutputDataReceived 事件将数据写入输出文件。

这里有两个示例链接-

  1. Process.OutputDataReceived Event
  2. Process.BeginOutputReadLine Method

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多