1

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

4

3 回答 3

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字符串中的回车而不是\字符后跟r字符也是如此。
  • 在程序路径上切换到双反斜杠而不是正斜杠以保持一致性。这种变化可能无关紧要。

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

您的程序继续无法运行的原因可能是因为:

  • 你有旧的pg_restore进程挂在锁上;和/或
  • 您没有使用 stdout 和 stderr ,因此pg_restore缓冲管道空间不足并阻止写入输出流。

如果您改用ProcessBuilder这一切都会简单得多。ProcessBuilder 允许您提供文件流以将输出写入其中,并且通常会为您处理很多事情。您仍然必须等待进程终止并检查其返回码。

于 2013-04-01T12:37:03.970 回答
3

最后我得到了解决方案

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);
}                    
于 2013-04-02T04:53:52.213 回答
0

以下代码完美地使用 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();
于 2013-07-16T13:04:32.697 回答