gpt4 book ai didi

java - 使用 java 恢复 PostgreSQL 数据库

转载 作者:行者123 更新时间:2023-11-29 12:28:58 24 4
gpt4 key购买 nike

我正在使用以下代码使用 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);

变化:

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

同时检查进程的返回状态。您必须使用 Process.waitFor()然后一旦它退出使用 Process.exitValue()来确定结果。您应该检查 Process 对象捕获的 stderr 和 stdout 是否有错误和日志信息。

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

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

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

关于java - 使用 java 恢复 PostgreSQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com