如何使用运行时/进程类从java备份mysql数据库?

时间:2012-02-10 17:31:04

标签: java mysql runtime.exec database-backups

我对此代码有疑问:

 try {            
    String cmd = "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe -uroot -proot foo_db -rC:\\backup.sql";

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(cmd);

 } catch(Exception e) {}

它没有任何错误,实际上它没有做任何事情:没有备份和没有执行cmd。问题出在哪里?

这很奇怪,因为cmd文本是正确的...我试图用Windows中的“执行”命令来做它并且它可以工作,但是在java中没有。

提前致谢。

2 个答案:

答案 0 :(得分:3)

正如@pcalcao指出的那样,你的第一个问题是你没有报告异常。你真的不应该这样做。至少你应该这样做:

} catch(Exception e) {
    e.printStackTrace();
}
  

java.io.IOException:无法运行程序“C:\ Program”:CreateProcess error = 193,%1不是Win32有效应用程序

这表示您的应用程序路径存在问题。默认情况下,如果使用单个参数调用exec(),则它将按空格分隔参数。由于路径中有空格,因此需要将字符串数组传递给exec()。类似的东西:

try {            
    String cmd =
        "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe";
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(new String[] { cmd, "-uroot", "-proot", "foo_db",
        "-rC:\\backup.sql" });
    // wait for it to finish
    proc.waitFor();
} catch(Exception e) {
    e.printStackTrace();
}

传递给exec()的字符串数组中的第一个参数是命令的完整路径 - 这个可以有空格。每个其他数组元素都是命令的参数。

最后,您需要等待该过程完成,否则它将在后台执行。这就是waitFor()的作用。

答案 1 :(得分:0)

你需要用\来逃避空格,exec正试图执行“C:\ Program”,这是你在回答我之前评论时所显示的内容。

从不 将catch子句留空。