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

标签 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中不行。

提前致谢。

最佳答案

正如 @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/

相关文章:

java - 为什么FullGC无法释放物理内存(RES)?

php - 如何指定显示的页数?

java - 如何根据用户输入运行某些进程,然后相应地销毁它们?

java - 运行时的 exec() 方法不重定向输出

java - 当线程更改状态时,有什么方法可以在进程中获取通知吗?

java - 从 java 程序中执行 .app 文件

java - 使用 apache FTPClient 从 FTP 服务器下载文件

python - 根据数据库验证 MySQL 的最快方法

Mysql 使用 Count 组函数无效?

Java Runtime.exec 通信可能吗?