我想用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的情况下生成数据库备份吗?
请尽快回复。
答案 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}}等其他内容。