从Java应用程序备份MySQL数据库

时间:2018-05-26 14:54:20

标签: java mysql

我试图从我的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中的错误吗?

3 个答案:

答案 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适合所有人。