gpt4 book ai didi

java - 运行时 - exec 使用 mysqldump JAVA 转储数据库

转载 作者:行者123 更新时间:2023-12-02 06:41:37 24 4
gpt4 key购买 nike

我正在尝试使用 mysqldump 和 java 为我的数据库创建转储。

我已经完成了代码,但由于某种我无法理解的原因,条件 if(processCompleted == 0) 从未发生。我这样说是因为在控制台上没有异常(exception),但它总是打印

"Error doing dump!"

这让我得出结论: if(processCompleted == 0) 永远不会满足。

有人可以解释一下我在这里做错了什么吗?

public boolean backupDatabase(String path, String whichServer)
{
String cmd;
Process runtimeProcess;

if(whichServer.equalsIgnoreCase("local"))
{
cmd = "mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword()
+ " --add-drop-database -B " + getSourceDatabase() + " -r " + path;
}
else if(whichServer.equalsIgnoreCase("remote"))
{
cmd = "mysqldump -u " + getDestinationUsername() + " -p" + getDestinationServerPassword()
+ " --add-drop-database -B " + getDestinationDatabase() + " -r " + path;
}
else
{
System.out.println("Input server incorrect");
return false;
}

try{

String[] cmdArray = new String[]{"C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe", cmd};
System.out.println("Preparing for dump.");
runtimeProcess = Runtime.getRuntime().exec(cmdArray);

int processCompleted = runtimeProcess.waitFor();

if(processCompleted == 0)
{
System.out.println("Dump done!");
return true;
}
else
{
System.out.println("Error doing dump!");
}

} catch(Exception ex)
{
System.out.println("Exception -> " + ex.getMessage());
}
return false;

}

这是我使用 @MadProgrammer 建议的代码:

public boolean backupDatabase(String path, String whichServer) 
{

List<String> args = new ArrayList<String>();
args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe");

args.add("-u");
args.add(getSourceUsername());
args.add("-p");
args.add(getSourceServerPassword());
args.add("--add-drop-database");
args.add("-B");
args.add(getSourceDatabase());
args.add("-r");
args.add(path);

try{
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectError();
Process p = pb.start();

InputStream is = p.getInputStream();

int in = -1;

while((in = is.read()) != -1)
{
System.out.println((char) in);
}

int proccessCompleted = p.waitFor();

if(proccessCompleted == 0)
{
System.out.println("Dump done!");
return true;
}
else
{
System.out.println("Error doing dump!");
return false;
}
}
catch(IOException | InterruptedException ex)
{
System.out.println("Exception exportDB -> " + ex.getMessage() + "|" + ex.getLocalizedMessage());
}
return false;
}
PS;你在哪里写了“//?这是一个命令吗?” -p 是获取密码的命令, getSourceServerPassword() 是获取密码的方法。

最佳答案

我怀疑,因为您将 cmdArray 仅分成两个元素,所以 mysqldump 将第二个数组元素视为单个命令行参数。

此外,您没有关注该过程的输出,这使得您很难确定该处理试图告诉您什么。

您的“基本”命令还包括mysqldump...

"mysqldump -u " + getSourceUsername() + " -p" + getSourceServerPassword()
+ " --add-drop-database -B " + getSourceDatabase() + " -r " + path;

作为命令的一部分,这意味着您正在有效地调用mysqldump mysqldump...

不要使用字符串,而是将所有命令放入某种列表中。

请记住,如果在命令行上用空格分隔,则它是一个单独的命令/元素

List<String> args = new ArrayList<String>
args.add("C:\\wamp\\bin\\mysql\\mysql5.5.24\\bin\\mysqldump.exe");
//...
args.add("-u");
args.add(getSourceUsername());
args.add("-p" + getSourceServerPassword()); //?? Is this a single command?
args.add("--add-drop-database");
args.add("-B");
args.add(getSourceDatabase());
args.add("-r");
args.add("path);
//...

然后使用 ProcessBuilder

ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectError();
Process p = pb.start();

InputStream is = p.getInputStream();
int in = -1;
while ((in = is.read()) != -1) {
System.out.print((char)in);
}

int processCompleted = p.waitFor();

请记住,您永远不应该忽略进程的输出,即使您不关心,您也应该尝试使用 InputStream 中的内容,因为如果有输出流,某些进程将挂起没读过。

关于java - 运行时 - exec 使用 mysqldump JAVA 转储数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19086052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com