2012-09-28 49 views
1
String[] executeCmd = new String[] { "mysql", "-u",DB_USER,"-p"+DB_PASSWORD,DB_NAME, " < ", "\""+FileName+"\"" }; 

Process runtimeProcess = Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
System.out.println("processComplete: " + processComplete); 

這是我使用過的代碼。程序在調用「waitFor()」方法時掛起。MySql備份不起作用

如何解決這個問題?

+0

這聽起來不錯,'w aitFor()'等待mysqldump完成運行,這對於大型數據庫可能需要幾個小時。 – Dai

+0

當你從命令行手動運行時,它是否工作 – Elbek

+0

@elber:它在命令提示符下手動工作。 順便說一句,它是一個帶有單表的小型數據庫 – Gapchoos

回答

0
String[] command = new String[]{"mysql", Constants.DB_NAME, "-u" + Constants.DB_USER, "-p" + Constants.DB_PASSWORD, "-e", " source "+FileName }; 

    try { 
      Process runtimeProcess = Runtime.getRuntime().exec(command); 
      int processComplete = runtimeProcess.waitFor(); 
      if (processComplete == 0) 
      { 
       System.out.println("DatabaseManager.restore: Restore Successfull"); 

      } 
      else 
      { 
       System.out.println("DatabaseManager.restore: Restore Failure!"); 
      } 

     return true; 

    } 

    catch (final Exception ex) 
    { 
     Application.showErrorInConsole(ex); 
     NmsLogger.writeErrorLog("Database Restore failed ", ex.toString()); 
     NmsLogger.writeDebugLog(ex); 
     return false; 

    } 

上面的代碼爲我工作得很好:)

5

你所需要的參數後添加空格,不要使用數組

String executeCmd = "mysqldump ", " -u ",DB_USER," -p " + DB_PASSWORD, + " " + DB_NAME, " < ", "\""+FileName+"\"" ; 

和清潔的方法是使用String.Format()

String executeCmd = String.Format("mysqldump -u %s -p %s %s < \"%s\"", DB_USER, DB_PASSWORD, DB_NAME, FileName) 
+0

你確定嗎? http://stackoverflow.com/questions/3695230/how-to-use-java-string-format。 'String.format(「%s支持它!」,「java」)' – Elbek

+0

@elber我已經編輯了答案。我顯示的原始'string.format'在'C#' –

+0

你說它不支持,不像C#,這就是我發佈的原因。 – Elbek

1
Backup: 
/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = 「dbName」; 
String dbUser = 「dbUser」; 
String dbPass = 「dbPass」; 
/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = 「」; 
executeCmd = 「mysqldump -u 「+dbUser+」 -p」+dbPass+」 「+dbName+」 -r backup.sql」; 
} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 
out.println(「Backup taken successfully」); 
} else { 
out.println(「Could not take mysql backup」); 
} 
Restore: 
/******************************************************/ 
//Database Properties 
/******************************************************/ 
String dbName = 「dbName」; 
String dbUser = 「dbUser」; 
String dbPass = 「dbPass」; 
/***********************************************************/ 
// Execute Shell Command 
/***********************************************************/ 
String executeCmd = 「」; 
executeCmd = new String[]{「/bin/sh」, 「-c」, 「mysql -u」 + dbUser+ 」 -p」+dbPass+」 」 + dbName+ 」 < backup.sql」 }; 
} 
Process runtimeProcess =Runtime.getRuntime().exec(executeCmd); 
int processComplete = runtimeProcess.waitFor(); 
if(processComplete == 0){ 
out.println(「success」); 
} else { 
out.println(「restore failure」); 
}