2011-12-12 70 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};