试图从java应用程序执行mysqldump,出现多个问题
我正在编写一个需要执行mysql转储的java应用程序,我正在使用本文中的runtime.exec。代码如下:试图从java应用程序执行mysqldump,出现多个问题,java,mysqldump,Java,Mysqldump,我正在编写一个需要执行mysql转储的java应用程序,我正在使用本文中的runtime.exec。代码如下: public int exectuteCommand(){ Runtime rt = Runtime.getRuntime(); logger.debug("exexuting cmd: " + showCommand()); int exit = -1; try { Process proc = rt.exec(cmd);
public int exectuteCommand(){
Runtime rt = Runtime.getRuntime();
logger.debug("exexuting cmd: " + showCommand());
int exit = -1;
try {
Process proc = rt.exec(cmd);
ExtProcessStreamHandler errorHandler = new ExtProcessStreamHandler(proc.getErrorStream(), "ERROR");
ExtProcessStreamHandler outHandler = new ExtProcessStreamHandler(proc.getInputStream(), "OUTPUT");
// kick it off
errorHandler.start();
outHandler.start();
exit = proc.waitFor();
} catch (IOException e) {
logger.error("ERROR!! ~~ executing command " + showCommand(), e);
e.printStackTrace();
} catch (InterruptedException e) {
logger.error("ERROR!! ~~ unexpected return for " + showCommand() + " , returned " + exit, e);
e.printStackTrace();
}
return exit;
}
1) 进程返回的命令在shell中工作(我在mac上运行)。我遇到的第一个错误是无法找到mysqldump命令。这将导致此错误:
java.io.IOException: Cannot run program "mysqldump": error=2, No such file or directory
我通过将文件的完整路径添加到命令中解决了这个问题。$PATH变量显示
/usr/local/mysql/bin/mysqldump
作为完整的路径。我如何确保我的java应用程序中有这些信息
2) 将完整路径添加到命令时,我收到以下错误消息:
INFO [Thread-1] (ExtProcessStreamHandler.java:28) - external process ERROR : mysqldump: Couldn't find table: ">"
以下是构建命令数组的代码:
return new String[] {MYSQLDUMP_CMD, "-u", USER_DEFAULT, "-p"+ PW_DEFAULT, TEST_DB_NAME,
">", DUMP_LOC};
同样,当我将传递给java应用程序的命令复制到mac上的shell中时,它也能工作。不知道我做错了什么。
提前谢谢 它认为“>”是一个用于mysqldump
的参数。您正在调用可执行文件,而不是计算shell表达式。如果您想通过管道传输输出,请使用代码中的outHandler
和errorHandler
另一种方法是调用shell并将要计算的表达式作为参数传递:
expr = new StringBuilder()
.append(MYSQLDUMP_CMD).append(' ')
.append("-u").append(USER_DEFAULT).append(' ')
.append("-p").append(PW_DEFAULT).append(' ')
.append(TEST_DB_NAME).append(' ')
.append(">").append(' ')
.append(DUMP_LOC)
.toString();
return new String[] {"/bin/bash", "-c", expr};
如果用于构建命令数组的代码没有将间隔参数用单引号括起来(或者如果JDK没有为您这样做),则修改StringBuilder语句以为您创建括起来的引号。它认为“>”是用于mysqldump
的参数。您正在调用可执行文件,而不是计算shell表达式。如果您想通过管道传输输出,请使用代码中的outHandler
和errorHandler
另一种方法是调用shell并将要计算的表达式作为参数传递:
expr = new StringBuilder()
.append(MYSQLDUMP_CMD).append(' ')
.append("-u").append(USER_DEFAULT).append(' ')
.append("-p").append(PW_DEFAULT).append(' ')
.append(TEST_DB_NAME).append(' ')
.append(">").append(' ')
.append(DUMP_LOC)
.toString();
return new String[] {"/bin/bash", "-c", expr};
如果构建命令数组的代码没有将间隔参数用单引号括起来(或者如果JDK没有为您这样做),那么请修改StringBuilder语句为您创建括起来的引号。下面的代码适合我
public static void backup() {
String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd"));
String backupPath = String.format("%s/%s.%s", Helper.BACKUP_PATH, currentDate, "sql");
File backupFile = new File(backupPath);
if (!backupFile.exists()) {
try {
backupFile.createNewFile();
String mysqlCom=String.format("mysqldump -u%s -p%s %s",USER_NAME,PASSWORD,DB);
String[] command = new String[] { "/bin/bash", "-c",mysqlCom};
ProcessBuilder processBuilder = new ProcessBuilder(Arrays.asList(command));
processBuilder.redirectError(Redirect.INHERIT);
processBuilder.redirectOutput(Redirect.to(backupFile));
Process process = processBuilder.start();
process.waitFor();
LOGGER.info("Backup done");
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
LOGGER.info("Database already backuped today");
}
}
下面的代码为我工作
public static void backup() {
String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd"));
String backupPath = String.format("%s/%s.%s", Helper.BACKUP_PATH, currentDate, "sql");
File backupFile = new File(backupPath);
if (!backupFile.exists()) {
try {
backupFile.createNewFile();
String mysqlCom=String.format("mysqldump -u%s -p%s %s",USER_NAME,PASSWORD,DB);
String[] command = new String[] { "/bin/bash", "-c",mysqlCom};
ProcessBuilder processBuilder = new ProcessBuilder(Arrays.asList(command));
processBuilder.redirectError(Redirect.INHERIT);
processBuilder.redirectOutput(Redirect.to(backupFile));
Process process = processBuilder.start();
process.waitFor();
LOGGER.info("Backup done");
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
LOGGER.info("Database already backuped today");
}
}
能够使用--result file选项而不是>解决此问题能够使用--result file选项而不是>