我对这段代码有疑问:
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中不行。
提前致谢。
最佳答案
正如 @pcalcao 指出的那样,您的第一个问题是您没有报告异常。你真的不应该这样做。至少你应该这样做:
} catch(Exception e) {
e.printStackTrace();
}
java.io.IOException: Cannot run program "C:\Program": CreateProcess error=193, %1 isn't a Win32 valid application
这表明您的应用程序路径有问题。默认情况下,如果使用单个参数调用 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()
的作用。
关于java - 如何使用运行时/进程类从java备份mysql数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9232113/