恢复mySQL数据库的运行时进程

时间:2016-03-09 22:17:33

标签: java mysql

与此链接类似:“How to restore a MySQL database backup using Java

我正在尝试通过运行时进程执行命令来使用mysql.exe恢复数据库。我已经尝试了几个命令,但我似乎无法使它工作。它们似乎都挂起并返回1的退出值。

这些是我尝试过的命令:

    String executeCmd = mySQLDir+"\\bin\\mysql -u root --password= testdb < " + backupFile;
    String[] executeCmd = new String[]{mySQLDir+"\\bin\\mysql", "-u", "root", "--password=", "testdb", " < " + backupFile};
    String[] executeCmd = new String[]{mySQLDir+"\\bin\\mysql", "--user=root", "--password=" , "testdb -e", " source "+backupFile};  
    String executeCmd = mySQLDir+"\\bin\\mysql -u root --password= testdb -e source "+ backupFile;

我试图通过输入流输出在执行过程中发生的事情,这会发生打印出来(还有更多的文字,但前两行是这样的):

C:\xampp\mysql\bin\mysql  Ver 15.1 Distrib 10.1.9-MariaDB, for Win32 (AMD64)
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Usage: C:\xampp\mysql\bin\mysql [OPTIONS] [database]

所以从我的理解来看,它似乎没有通过java识别命令,但通过命令提示符执行它似乎工作。有什么想法吗?

编辑:用户提到该命令可能不正确,因此输出到第三个executeCommand:

C:\xampp\mysql\bin\mysql
--user=root
--password=
testdb -e
source C:\Users\AA\Documents\NetBeansProjects\TestProject\backup\testDBBackup69-03-2016%19-27-45.sql

我尝试在第二个命令中使用空格:

String[] executeCmd = new String[]{mySQLDir+"\\bin\\mysql", " -u ", "root", " --password=", " testdb ", "< " + backupFile};

导致使用system.print输出:

C:\xampp\mysql\bin\mysql -u root --password= test < C:\Users\AA\Documents\NetBeansProjects\TestProject\backup\testDBBackup69-03-2016%19-27-45.sql

我知道这个命令在cmd中肯定有效但在java中仍然不起作用

我已经解决了这个问题,答案如下。

2 个答案:

答案 0 :(得分:0)

除非启动shell,否则无法获得重定向。 exe不会理解<

"cmd", "/c"放入String []数组的前面。

答案 1 :(得分:0)

我已经使用Process Builder类解决了这个问题。

示例代码:

        String[] command = new String[]{mySQLDir+"\\bin\\mysql ", "-uroot", "--password=", "testdb"};
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder = new ProcessBuilder(Arrays.asList(command));
        processBuilder.redirectError(Redirect.INHERIT);
        processBuilder.redirectInput(Redirect.from(backupFile));
        Process process = processBuilder.start();
        process.waitFor();