使用java恢复PostgreSQL数据库

我使用以下代码使用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个表,但只有一个表正在恢复为什么其余的表没有发生我的代码中的错误? 提前致谢!!!!

令人惊讶的是,您显示的命令完全起作用,因为您未能引用命令路径中的空格。 尝试:

 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); 

变化:

  • 将单字符串forms转换为exec调用的更安全的参数数组forms;
  • 由于原始命令无法转义反斜杠,因此在rawDatabase路径中rawDatabase反斜杠,因此\r是字符串中的回车符,而不是\ char后跟r char。
  • 在程序路径上切换为加倍反斜杠而不是正斜杠以保持一致性。 这种变化可能并不重要。

还要检查进程的返回状态。 您必须使用Process.waitFor()然后退出后使用Process.exitValue()来确定结果。 您应该检查Process对象捕获的stderr和stdout以获取错误和日志记录信息。

你的程序继续不工作的原因可能是因为:

  • 你有旧的pg_restore进程挂着锁; 和/或
  • 你没有消耗stdout和stderr所以pg_restore用完了缓冲的管道空间并阻塞了输出​​流的写入。

如果您使用ProcessBuilder这将更加简单。 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); } 

以下代码完全适用于使用JAVA代码获取postgres数据库转储。试试这个

 List cmds = new ArrayList(); 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();