2011-12-12 69 views
2

我有我將用它來備份和恢復MySQL數據庫的小型應用程序,編碼備份如下所示,正常工作恢復mysql數據庫,如何備份和使用Java

.... 
String command = "mysqldump --host=" + dataBase.getHost() + " --user=" + dataBase.getUserName() + " --password=" + dataBase.getPassword() + " " 
       + dataBase.getDatabaseName() + " -r " + dataBase.getBackupPath() + "/ofm_mnu_backup_" + bkDate + ".sql"; 
     System.out.println(command); 
     Process p = null; 
     try { 


      Runtime runtime = Runtime.getRuntime(); 
      p = runtime.exec(command); 

      int processComplete = p.waitFor(); 

      if (processComplete == 0) { 

       System.out.println("Backup created successfully"); 

      } else { 
       System.out.println("Could not create the backup"); 
      } 
.... 

但當我嘗試恢復使用它不工作下列代碼數據庫,請大家幫忙

........ 
    String command = "mysqldump --host=" + dataBase.getHost() + " --user="+dataBase.getUserName() + " --password= " + dataBase.getPassword()+""+dataBase.getDatabaseName() + " " + dataBase.getBackupPath(); 
     Process p = null; 

     try { 
      System.out.println(command); 
      Runtime runtime = Runtime.getRuntime(); 
      p = runtime.exec(command); 
      int processComplete = p.waitFor(); 

      if (processComplete == 0) { 
       System.out.println("Backup restored successfully"); 

      } else { 
       System.out.println("Could not restore the backup"); 
      } 
    ...... 

這麼多的谷歌搜索後,我找到了答案我的事,

...... 
    String[] executeCmd = new String[]{"mysql", [database], "--user=" + [username],"--password=" + [password], "-e", " source " + [absolute path to the sql file]}; 
    p = Runtime.getRuntime().exec(executeCmd); 
    int processComplete = p.waitFor(); 
    ...... 

在上面的代碼中,最重要的事情是**「source」+ [sql文件的絕對路徑] **在'source'字和文件路徑之間不應該有逗號。

這對我有效,我希望它也適用於你們。

+0

必須設置Mysql_home \ bin的路徑嗎? – adatapost

+0

noup我沒有設置Mysql_home \ bin的路徑,因爲mysql作爲服務在我的服務器上運行 – Harsha

回答

7

我不認爲你正在使用mysqldump命令很對。您是否使用<>字符來表示備份/恢復?這在長度here討論。事情是這樣的備份:

String command = "mysqldump --host=" + dataBase.getHost() + " --user=" + dataBase.getUserName() + " --password=" + dataBase.getPassword() + " " 
      + dataBase.getDatabaseName() + " > " + dataBase.getBackupPath() + "/ofm_mnu_backup_" + bkDate + ".sql"; 

和恢復:

String command = "mysqldump --host=" + dataBase.getHost() + " --user=" + dataBase.getUserName() + " --password=" + dataBase.getPassword() + " " 
      + dataBase.getDatabaseName() + " < " + dataBase.getBackupPath() + "/ofm_mnu_backup_" + bkDate + ".sql"; 
+0

- >我改變了上面提到的備份代碼,它可以在終端中正常工作,但它在工作時不工作被放入java代碼中。 – Harsha

+0

不工作,因爲在processcomplete == 0,或其他一些問題?另外,你在什麼操作系統? – SuperTron

+0

我正在使用Fedora 14 – Harsha

0

也許是因爲分配給該終端輸出流的其... 是它的CMD裏面運行的mysqldump命令的選項? 例如

String command = "cmd /K mysqldump..." 

您可能也有興趣閱讀this文章:

希望,這有助於

0

這真的工作了恢復

String comando = "C:\\MySQL\\bin\\mysql.exe --host=localhost --port=3306 --user=root --password=123 < D:\\back.sql"; 
File f = new File("restore.bat"); 
FileOutputStream fos = new FileOutputStream(f); 
fos.write(comando.getBytes()); 
fos.close(); 
Process run = Runtime.getRuntime().exec("cmd /C start restore.bat "); 

和備份

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.forLanguageTag("ru")); 
    java.util.Date currentDate = new java.util.Date(); 
    Process p = null; 
    try { 
     Runtime runtime = Runtime.getRuntime(); 
     p = runtime.exec("C:\\MySQL\\bin\\mysqldump.exe --default-character-set=utf8 -uroot -p123 -c -B shch2 -r " + "D:/" + dateFormat.format(currentDate) + "_backup" + ".sql"); 

//使用dbpass和dbname更改dbpass和dbname int processComplete = p.waitFor();

 if (processComplete == 0) { 

      System.out.println("Backup created successfully!"); 

     } else { 
      System.out.println("Could not create the backup"); 
     } 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

,但你需要傳達的確切路徑和的mysql.exe mysqldump.exe

1

我想感謝你們對如何使用Java代碼還原mysql數據庫的支持。由於沒有任何代碼爲我工作,但它給了我一個柚木工作的線索。

以下是我的最終工作代碼。

String[] executeCmd = new String[]{"C:\\xampp\\mysql\\bin\\mysql.exe",mydb, "--user=" + dbUserName, "--password=" + dbPassword, "-e", " source " + source};