2013-09-30 50 views
0

我想用java的mysqldump来为我的数据库创建一个转储。运行时 - 执行到使用mysqldump转储数据库JAVA

我已经完成了代码,但条件if(processCompleted == 0)永远不会出于某种原因,我不明白。我这样说是因为在控制台上没有例外,但它总是打印

“执行转储时出错!

这导致我得出结论,如果(processCompleted == 0)永远不会见面。

有人可以请解释我在做什么错在这里?

public boolean backupDatabase(String path, String whichServer) 
{ 
    String cmd; 
    Process runtimeProcess; 

    if(whichServer.equalsIgnoreCase("local")) 
    { 
     cmd = "mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword() 
      + " --add-drop-database -B " + getSourceDatabase() + " -r " + path; 
    }   
    else if(whichServer.equalsIgnoreCase("remote")) 
    { 
     cmd = "mysqldump -u " + getDestinationUsername() + " -p" + getDestinationServerPassword() 
      + " --add-drop-database -B " + getDestinationDatabase() + " -r " + path; 
    } 
    else 
    { 
     System.out.println("Input server incorrect"); 
     return false; 
    } 

    try{ 

     String[] cmdArray = new String[]{"C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe", cmd}; 
     System.out.println("Preparing for dump."); 
     runtimeProcess = Runtime.getRuntime().exec(cmdArray); 

     int processCompleted = runtimeProcess.waitFor(); 

     if(processCompleted == 0) 
     { 
      System.out.println("Dump done!"); 
      return true; 
     } 
     else 
     { 
      System.out.println("Error doing dump!"); 
     } 

    } catch(Exception ex) 
    { 
     System.out.println("Exception -> " + ex.getMessage()); 
    } 
    return false; 

} 

下面是使用@MadProgrammer建议我的代码:

public boolean backupDatabase(String path, String whichServer) 
{ 

    List<String> args = new ArrayList<String>(); 
    args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe"); 

    args.add("-u"); 
    args.add(getSourceUsername()); 
    args.add("-p"); 
    args.add(getSourceServerPassword()); 
    args.add("--add-drop-database"); 
    args.add("-B"); 
    args.add(getSourceDatabase()); 
    args.add("-r"); 
    args.add(path); 

    try{ 
     ProcessBuilder pb = new ProcessBuilder(args); 
     pb.redirectError(); 
     Process p = pb.start(); 

     InputStream is = p.getInputStream(); 

     int in = -1; 

     while((in = is.read()) != -1) 
     { 
      System.out.println((char) in); 
     } 

     int proccessCompleted = p.waitFor(); 

     if(proccessCompleted == 0) 
     { 
      System.out.println("Dump done!"); 
      return true; 
     } 
     else 
     { 
      System.out.println("Error doing dump!"); 
      return false; 
     } 
    } 
    catch(IOException | InterruptedException ex) 
    { 
     System.out.println("Exception exportDB -> " + ex.getMessage() + "|" + ex.getLocalizedMessage()); 
    } 
    return false; 
} 

PS;你在哪里写的“//这是一个单一的命令?” -p是密码的命令,getSourceServerPassword()是获取密码的方法。

回答

2

我怀疑是因为你已经将cmdArray分隔成两个元素,mysqldump将第二个数组元素作为单个命令行参数对待。

此外,您还没有关注过程的输出,这使得确定处理过程试图说明的内容非常困难。

你“基地”命令还包括mysqldump ...

"mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword() 
     + " --add-drop-database -B " + getSourceDatabase() + " -r " + path; 

的命令,这意味着你实际上调用mysqldump mysqldump的一部分......

而不是使用String,全部到位您的命令改为某种列表。

记住,如果它是由一个空间在命令行中分离出来,它是一个单独的命令/元素

List<String> args = new ArrayList<String> 
args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe"); 
//... 
args.add("-u"); 
args.add(getSourceUsername()); 
args.add("-p" + getSourceServerPassword()); //?? Is this a single command? 
args.add("--add-drop-database"); 
args.add("-B"); 
args.add(getSourceDatabase()); 
args.add("-r"); 
args.add("path); 
//... 

然后使用ProcessBuilder

ProcessBuilder pb = new ProcessBuilder(args); 
pb.redirectError(); 
Process p = pb.start(); 

InputStream is = p.getInputStream(); 
int in = -1; 
while ((in = is.read()) != -1) { 
    System.out.print((char)in); 
} 

int processCompleted = p.waitFor(); 

记住,你永远不应该从忽略输出过程中,即使您不在意,也应该尝试使用InputStream中的内容,因为如果未读取输出流,某些进程将挂起。

+0

感谢您的帮助,但现在我得到了'java.lang.NullPointerException'作为'Process p = pb.start();' 我可以用您编写的代码编辑最初的问题,如果您想要 – dazito

+0

是的,一个更新将是有用的... – MadProgrammer

+0

完成,请检查它 – dazito