使用java恢复PostgreSQL数据库

时间:2013-04-01 12:31:15

标签: 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:\sathish\rawDatabase.backup";
 p = r.exec(cmd);

我在rawDatabase.backup文件中有42个表,但只有一个表正在恢复为什么其余的表没有发生我的代码中的错误? 提前谢谢!!!!

3 个答案:

答案 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进程;和/或
  • 您没有使用stdout和stderr,因此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();