使用以下代码使用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:\sathish\rawDatabase.backup";
p = r.exec(cmd);
我在rawDatabase.backup文件中有42个表,但只有一个表正在恢复为什么其余的表没有发生我的代码中的错误? 提前谢谢!!!!
答案 0 :(得分:7)
令人惊讶的是,您显示的命令完全有效,因为您未能在命令路径中引用空格。尝试:
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
调用的更安全的参数数组形式; rawDatabase
路径中的反斜杠,因为原始命令无法转义反斜杠,因此\r
是字符串中的回车而不是\
字符,后跟{{ 1}} char。同时检查流程的返回状态。您必须先使用Process.waitFor()
,然后退出使用Process.exitValue()
以确定结果。您应该检查r
对象捕获的stderr和stdout是否存在错误和日志信息。
你的程序继续不工作的原因可能是因为:
Process
进程;和/或pg_restore
会耗尽缓冲的管道空间并阻塞在输出流上写入。如果你use ProcessBuilder
instead,这一切都会变得更加简单。 ProcessBuilder允许您提供文件流以将输出写入,并且通常会为您处理大量此类操作。您仍然必须等待进程终止并检查其返回代码。
答案 1 :(得分:2)
最后我得到了解决方案
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);
}
答案 2 :(得分:0)
以下代码完美地用于使用JAVA代码获取postgres数据库转储。试试这个
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();