使用java恢复PostgreSQL数据库

Sat*_*ish 1 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);
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*ger 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);
Run Code Online (Sandbox Code Playgroud)

变化:

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

还要检查进程的返回状态.Process.waitFor()一旦退出使用Process.exitValue(),您必须使用它来确定结果.您应该检查Process对象捕获的stderr和stdout 是否存在错误和日志记录信息.

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

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

如果这都将是简单得多的使用ProcessBuilder代替.ProcessBuilder允许您提供文件流以将输出写入,并且通常会为您处理大量此类操作.您仍然必须等待进程终止并检查其返回代码.