2012-02-10 1 views
0

У меня есть проблема с этим кодом:Как создать резервную копию mysql db из java, используя классы времени выполнения/процесса?

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) {} 

Он не получает какую-либо ошибку, Pratically это ничего не делать: не резервное копирование и не выполнение ЦМД. Где проблема?

Странно, потому что cmd-текст правильный ... Я пытался сделать это с помощью команды «Выполнение» в окнах, и он работает, но в java нет.

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

+2

Вызывает ли это исключение? Попробуйте добавить e.printStackTrace() в предложение catch. – pcalcao

+0

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

ответ

0

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

НИКОГДА оставьте поле улова пустым.

+0

У меня есть разрешено помещать '\ '' в путь, теперь это работает. Спасибо за советы! – user1197919

+0

Нет проблем :) Правильный способ поблагодарить за правильный ответ на SO - это принять ответ;) – pcalcao

3

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

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

java.io.IOException: Cannot run program "C:\Program": CreateProcess error=193, %1 isn't a Win32 valid application

Это говорит, что у вас есть проблемы с путем приложения. По умолчанию, если 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().

+0

Классические пробелы в пути' проблема. – citizenen