我试图从我的Java应用程序备份我的MySQL数据库。 这是代码:
String executeCmd = "mysqldump.exe -u " + dbUser + " -p" + dbPass;
executeCmd += " --all-databases > " + savePath;
System.out.println(executeCmd);
Runtime.getRuntime().exec(executeCmd);
但它什么都不做。如果我复制System.out.println的输出并将其粘贴到cmd它工作正常。有人能说出Java中的错误吗?
答案 0 :(得分:1)
我强烈建议您阅读this canonical article on JavaWorld about Runtime.getRuntime()
。长话短说,你的代码有两个主要问题。首先,您不是在等待该过程完成,其次您没有处理该过程的输出。从上面的文章中部分地考虑以下代码,我们可以编写一个应该工作的版本:
try {
Runtime rt = Runtime.getRuntime();
String executeCmd = "mysqldump.exe -u " + dbUser + " -p" + dbPass;
executeCmd += " --all-databases > " + savePath;
Process proc = rt.exec(executeCmd);
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
}
catch (Throwable t) {
t.printStackTrace();
}
正如您所说,如果从运行此代码的同一台计算机上成功调用mysqldump
,则应该没有错误警告。如果有任何错误,那么上面的片段应该让您处于有利位置,看看它们是什么,并处理它们。
答案 1 :(得分:0)
尝试使用waitFor(),类似这样。
public boolean backupDB(String dbName, String dbUserName, String dbPassword, String path) {
String executeCmd = "mysqldump.exe -u " + dbUserName + " -p "+dbPassword+" --all-databases > " + path;
Process runtimeProcess;
try {
runtimeProcess = Runtime.getRuntime().exec(executeCmd);
int processComplete = runtimeProcess.waitFor();
if (processComplete == 0) {
System.out.println("Backup created successfully");
return true;
} else {
System.out.println("Could not create the backup");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
答案 2 :(得分:0)
解决。问题在于executeCmd。 它的工作原理如下:
String executeCmd = "mysqldump.exe -u " + dbUser + " -p" + dbPass+" dbName -r " + savePath;
我不明白为什么它不能与--all-databases一起使用,但问题解决了。 THX适合所有人。