使用java恢复PostgreSQL数据库
我使用以下代码使用java恢复PostgreSQL数据库使用java恢复PostgreSQL数据库,java,postgresql,runtime.exec,Java,Postgresql,Runtime.exec,我使用以下代码使用java恢复PostgreSQL数据库 Runtime r = Runtime.getRuntime(); Process p; String cmd ="D:/Program Files/PostgreSQL/9.1/bin/pg_restore.exe --host localhost --port 5432 --username postgres --dbname mytestqq --role postgres --no-password --verbose D
Runtime r = Runtime.getRuntime();
Process p;
String cmd ="D:/Program Files/PostgreSQL/9.1/bin/pg_restore.exe --host localhost --port 5432 --username postgres --dbname mytestqq --role postgres --no-password --verbose D:\sathish\rawDatabase.backup";
p = r.exec(cmd);
我在rawDatabase.backup文件中有42个表,但只有一个表被还原为什么其余的表没有发生我的代码中有什么错误?
提前感谢 令人惊讶的是,您显示的命令居然可以工作,因为您没有引用命令路径中的空格。尝试:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
变化:
将exec调用的单字符串形式转换为更安全的参数数组形式;
将RAWDABASE路径中的反斜杠加倍,因为原始命令无法转义反斜杠,因此\r是字符串中的回车符,而不是后跟r字符的\char。
在程序路径上切换为双反斜杠,而不是前斜杠,以保持一致性。这种变化可能并不重要。
还要检查流程的返回状态。一旦退出,您必须使用then来确定结果。您应该检查流程对象捕获的stderr和stdout,以获取错误和日志信息
您的程序继续无法运行的原因可能是:
你有旧的pg_恢复过程挂在持有锁;和/或
您没有使用stdout和stderr,因此pg_restore会耗尽缓冲管道空间,并阻塞对输出流的写入。
如果你愿意,这一切都会简单得多。ProcessBuilder允许您提供用于写入输出的文件流,并且通常会为您处理很多这方面的工作。您仍然必须等待进程终止,并检查其返回代码。令人惊讶的是,您显示的命令居然可以工作,因为您无法引用命令路径中的空格。尝试:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
变化:
将exec调用的单字符串形式转换为更安全的参数数组形式;
将RAWDABASE路径中的反斜杠加倍,因为原始命令无法转义反斜杠,因此\r是字符串中的回车符,而不是后跟r字符的\char。
在程序路径上切换为双反斜杠,而不是前斜杠,以保持一致性。这种变化可能并不重要。
还要检查流程的返回状态。一旦退出,您必须使用then来确定结果。您应该检查流程对象捕获的stderr和stdout,以获取错误和日志信息
您的程序继续无法运行的原因可能是:
你有旧的pg_恢复过程挂在持有锁;和/或
您没有使用stdout和stderr,因此pg_restore会耗尽缓冲管道空间,并阻塞对输出流的写入。
如果你愿意,这一切都会简单得多。ProcessBuilder允许您提供用于写入输出的文件流,并且通常会为您处理很多这方面的工作。您仍然必须等待进程终止并检查其返回代码。最终我得到了解决方案
Runtime r = Runtime.getRuntime();
Process p;
ProcessBuilder pb;
r = Runtime.getRuntime();
pb = new ProcessBuilder(
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host=localhost",
"--port=5432",
"--username=postgres",
"--dbname=mytestqq",
"--role=postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup");
pb.redirectErrorStream(true);
p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String ll;
while ((ll = br.readLine()) != null) {
System.out.println(ll);
}
我终于找到了解决办法
Runtime r = Runtime.getRuntime();
Process p;
ProcessBuilder pb;
r = Runtime.getRuntime();
pb = new ProcessBuilder(
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host=localhost",
"--port=5432",
"--username=postgres",
"--dbname=mytestqq",
"--role=postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup");
pb.redirectErrorStream(true);
p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String ll;
while ((ll = br.readLine()) != null) {
System.out.println(ll);
}
下面的代码在使用JAVA代码获取postgres DB转储时非常有效
List<String> cmds = new ArrayList<String>();
cmds.add("C:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_dump.exe");
cmds.add("-i");
cmds.add("-h");
cmds.add("localhost");
cmds.add("-p");
cmds.add("5432");
cmds.add("-U");
cmds.add("YOUR PG USERNAME");
cmds.add("-F");
cmds.add("c");
cmds.add("-b");
cmds.add("-v");
cmds.add("-f");
cmds.add("\"E:\\pg_dump.backup\"");//Location to store db Dump backup
cmds.add("lmd");
ProcessBuilder process = new ProcessBuilder();
process.command(cmds).start();
下面的代码在使用JAVA代码获取postgres DB转储时非常有效
List<String> cmds = new ArrayList<String>();
cmds.add("C:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_dump.exe");
cmds.add("-i");
cmds.add("-h");
cmds.add("localhost");
cmds.add("-p");
cmds.add("5432");
cmds.add("-U");
cmds.add("YOUR PG USERNAME");
cmds.add("-F");
cmds.add("c");
cmds.add("-b");
cmds.add("-v");
cmds.add("-f");
cmds.add("\"E:\\pg_dump.backup\"");//Location to store db Dump backup
cmds.add("lmd");
ProcessBuilder process = new ProcessBuilder();
process.command(cmds).start();
谢谢你的回答,我已经尝试了你的代码,但仍然面临同样的问题…所以strange@Sathish您是否也按照我的建议等待pg_还原进程使用process.waitFor完成,并检查process.exitValue中的非零返回代码?另外,我刚刚更新了答案,我没有注意到您的命令中也没有双反斜杠。是的,我已经给出了所有指示,双反斜杠p.waitForand p.exitValue仍然面对相同的值issue@Sathish好的,那么p.exitValue返回什么?如果您阅读并打印错误流,是否有任何信息?让我们感谢您的回答,我已经尝试了您的代码,但仍然面临相同的问题…所以strange@Sathish您是否也按照我的建议等待pg_还原进程使用process.waitFor完成,并检查process.exitValue中的非零返回代码?另外,我刚刚更新了答案,我没有注意到您的命令中也没有双反斜杠。是的,我已经给出了所有指示,双反斜杠p.waitForand p.exitValue仍然面对相同的值issue@Sathish好的,那么p.exitValue返回什么?如果您阅读并打印错误流,是否有任何信息?让我们@Craig最终我得到了解决方案谢谢跟进。您显示的代码看起来几乎正确,您只需等待进程完成并获取返回值,以确保还原实际成功。@Sathish,您给出了错误的答案。根据以2个破折号开头的参数的长变量,例如,-主机应如下所示:-param_name=param_value。在您的情况下,-host=localhost,依此类推。@Craig最后我得到了解决方案,谢谢您的跟进。您显示的代码看起来几乎正确,您只需等待流程完成并获取返回值,以确保恢复实际成功@ 萨提斯,你回答错了。根据以2个破折号开头的参数的长变量,例如,-主机应如下所示:-param_name=param_value。在您的例子中,是-host=localhost,以此类推。