如何使用java创建postgres数据库的备份

时间:2014-02-06 08:17:09

标签: java postgresql

我想用java备份postgres数据库。我正在使用以下代码 但这不起作用,也没有生成转储。

String pgDump = "C:\\Program Files\\PostgreSQL\\9.2\\bin\\pg_dump";
          String dumpFile = "D:\\test\\"+ tenant.getTenantAsTemplate()+".sql";
          String sql = pgDump+" -h localhost -U postgres -P postgres " + tenant.getTenantAsTemplate()+" > "+dumpFile;
          Process p = Runtime.getRuntime().exec(sql);
          int time = p.waitFor();
          System.out.println("time is "+time);
          if(time == 0){
            System.out.println("backup is created");
          }
          else{
            System.out.println("fail to create backup");
          }

这里我的时间是1。

这也是操作系统依赖,我们还需要 pg_dump 。有什么其他方法可以在没有pg_dump的情况下生成数据库备份吗?

请尽快回复。

1 个答案:

答案 0 :(得分:1)

不,使用常规SQL连接无法在没有pg_dump的情况下生成数据库备份。这是一个常见问题解答,但是想要这个功能的人永远不会在PostgreSQL中实现这个功能。

我认为从技术上讲,您可以使用复制连接来执行像pg_basebackup这样的物理基础备份,但这并不是您想要的,需要复制计算机上的所有数据库,并且需要做很多工作。

您应使用String[]形式的Runtime.exec作为I mentioned in a related answer regarding pg_restore

您还必须检查进程exit value以查看它是否成功终止,并且您必须小心处理,而不仅仅是吞下,抛出任何异常。

您的代码无法检查退出值,我认为可能是因为您没有正确引用pg_dump的路径而导致格式错误的命令失败并返回非零退出代码。要查看错误,打印最终组装的命令行,您将看到如下内容:

C:\Program Files\PostgreSQL\9.2\bin\pg_dump -h localhost ....

哪个cmd.exe将拆分为:

c:\Program
Files\postgresql\9.2\bin\pg_dump
-h
localhost

...等

看到问题?

只引用pg_dump的路径来解决此问题。使用String[] exec形式%environmentvars%并且您不必这样,而且它可以正常用于路径中的偶然{{1}}等其他内容。