Как создать резервную копию mysql db из java с использованием классов runtime/process?

У меня проблема с этим кодом:

try { 
 String cmd = "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe -uroot -proot foo_db -rC:\\backup.sql";

 Runtime rt = Runtime.getRuntime();
 Process proc = rt.exec(cmd);

 } catch(Exception e) {}

Он не получает никаких ошибок, поэтому он не делает ничего: никаких резервных копий и никакого выполнения cmd. Где проблема?

Это странно, потому что cmd-текст правильный... Я пытался сделать это с помощью команды "Execute" в Windows, и это работает, но в java нет.

Заранее спасибо.

2 ответа

Ваша первая проблема заключалась в том, что, как отметил @pcalcao, вы не сообщаете об исключении. Вы действительно никогда не должны этого делать. По крайней мере, вы должны сделать:

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

java.io.IOException: не удается запустить программу "C:\Program": ошибка CreateProcess = 193,% 1 не является действительным приложением Win32

Это говорит о том, что у вас есть проблема с вашим приложением. По умолчанию, если exec() вызывается с единственным аргументом, он разбивает аргументы на пробелы. Поскольку у вас есть пробелы в вашем пути, вам нужно передать массив строк в exec(). Что-то вроде:

try { 
 String cmd =
 "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe";
 Runtime rt = Runtime.getRuntime();
 Process proc = rt.exec(new String[] { cmd, "-uroot", "-proot", "foo_db",
 "-rC:\\backup.sql" });
 // wait for it to finish
 proc.waitFor();
} catch(Exception e) {
 e.printStackTrace();
}

Первый аргумент в массиве строк, переданный exec() - это полный путь к команде - это может иметь пробелы. Каждый из других элементов массива является аргументом команды.

Наконец, вам нужно будет дождаться завершения процесса, иначе он будет выполняться в фоновом режиме. Это то, что waitFor().


Вам нужно избежать пробела с помощью \, exec пытается выполнить "C:\Program", из того, что вы показали в своем ответе на мой предыдущий комментарий.

НИКОГДА не оставляйте предложение catch пустым.

licensed under cc by-sa 3.0 with attribution.