java调用pg_dump备份postgre数据库问题

在项目中,用java调用pg_dump进行postgre数据库备份,在本地机上跑,可以正确运行,发布

到其他机器上之后,会在调用外部程序,进行备份的地方卡住,代码如下:

/**备份数据库**/

File workPath=fetchDBInstallPath();//获取数据库的pg_dump工具的目录

if(workPath==null){

return false;

String dbBackupPath=fetchDBBackupPath();

StringBuffer sb=new StringBuffer();

sb.append( cmd /c pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v

-f ).append(dbBackupPath+ \\ +fileName+ .backup ).append( dbname );

log.info( ********************************************** );

log.info( workPath= +workPath); www.docin.com

log.info( command: +sb.toString());

log.info( ********************************************** );

Process

process=Runtime.getRuntime().exec(sb.toString(),null,workPath);

log.info( ~~~~~~~~~~~~~~~~~~~~~~~~~~~ );

StreamGobbler errorGobbler = new

StreamGobbler(process.getErrorStream(), Error ); //线程,用于输出外部程序的输

出内容,防止阻塞

StreamGobbler outputGobbler = new

StreamGobbler(process.getInputStream(), Output ); //线程,用于输出外部程序的输

出内容,防止阻塞

log.info( +++++++++++++++++++++++++++ );

errorGobbler.start();

outputGobbler.start();

process.waitFor();

if(process.exitValue()!=0){

return false;

} www.docin.com

从部署机器上的日志来看,运行完成了log.info( +++++++++++++++++++++++++++ );

之后,线程没有正确运行,也就是说,应该是外部程序被阻塞了,然后我把命令行中的-v参数

去掉,不让外部程序输出内容,可还是会阴塞,具体日志如下:

2012-10-12 10:23:43.551 INFO] **********************************************

2012-10-12 10:23:43.551 INFO] workPath=C:\Program

Files\hikvision\CMS\database\bin

2012-10-12 10:23:43.551 INFO] command:cmd /c pg_dump -h 127.0.0.1 -p 5432 -U

postgres -F c -b -v -f c:\backup\test.backup 5221cms

2012-10-12 10:23:43.551 INFO] **********************************************

2012-10-12 10:23:43.711 INFO] ~~~~~~~~~~~~~~~~~~~~~~~~~~~

2012-10-12 10:23:43.711 INFO] +++++++++++++++++++++++++++

------最佳解决方案--------------------------------------------------------

在命令前添加一行

www.docin.com

set PGPASSWORD= password

OpenERP(08年5月前称之为TinyERP)是一个ERP/CRM系统。它使用Python语言开发, 数据库 采用开源的 PostgreSQL ,系统以GNU GPL开 源协议发布。 系统提供较灵活的模块架构,常用模块包括:采购管理,销售管理,库存管理,财务管理,货品管理,营销管理,客户关系管理,生产管理,人事管理,服务支持等等。用户可以直接从模块库中选择安装适用模块,或进行模块卸载,升级的管理操作。 数据库 备份 有多种分类方式。按照 备份 后的文件类型,可以分为物理 备份 (文件系统级别的 备份 )和逻辑 备份 ( 备份 后的文件是sql文件或特定格式的导出文件);按照 备份 过程中是否停止 数据库 服务,可分为冷 备份 ( 备份 过程中停止 数据库 服务)和热 备份 ( 备份 过程中 数据库 服务开启并可供用户访问);按照 备份 是否是完整的 数据库 ,可分为全量 备份 ( 备份 是完整的 数据库 )和增量 备份 ( 备份 是上一次全量 备份 数据库 改变的内容)。 Post ... psql 和 pg _ dump 等工具连接 PostgreSQL 数据库 时,通过-W参数,在终端以交互方式输入密码,很多时候,我们希望使用脚本 调用 psql或者 pg _ dump 做一些自动化的操作,那么此时如何以非交互方式指定密码? 作者:阎书利 pg quarrel是一个 PostgreSQL 数据库 数据库 结构(DDL)比对工具。它会对比两个 数据库 源,并输出一个表示DDL差异的文件。 如果将输出文件运行到目标 数据库 中,它将具有与源 数据库 相同的结构。 主要使用场景是将 数据库 更改部署到测试或生产环境。 pg quarrel不依赖于另一个工具(如 pg _ dump ),而是直接连接到 PostgreSQL 服务器,从目录中获取元数据,比较对象并输出将目标 数据库 转换为源 数据库 所需的命令。它拥有过滤器选项:所以,可以比较部分对象。 它可以适用于不同的Pos 我有一个特定的架构来设置 postgresql .我有一个基于两个 数据库 N和N 1的系统 . 数据库 N可用于只读模式的客户端, 数据库 N 1可用于客户端的修改 . 客户端还可以向系统发送两个命令:"apply"命令:保留对N 1 db进行的所有修改,并且系统的新状态是具有N 1数据和具有相同数据的N 2 db的只读 数据库 .A "reset"命令:删除N 1 db并为用户创建N 数据库 的新副本以进行写入访... 背景身为一枚主要做后端的程序员,跟 数据库 打交道是必不可少的,虽然 数据库 由专门的dba进行负责,技多不压身。于是,把日常对 postgresql 数据库 的日常操作比较频繁的进行记录下来,一是自己找的时候方便,另外也与大家做个分享交流。命令介绍除去写相关的sql工作,工作上用到比较多的就是 数据库 备份 与恢复、导表,今天先介绍一下 数据库 备份 与恢复。 pg _ dump 是一个用于 备份 的命令工具,即使当前 数据库 ... 最近要用 JAVA 做一个 PostgreSQL 备份 功能,没想到遇到一个大坑。在网上搜索,很快就找到一个用 JAVA 的Runtime.getRuntime().exec()执行cmd命令来 备份 的方法。执行代码后发现,没有导出对应的SQL文件。我觉得可能是命令有 问题 ,于是我在cmd执行了这条命令,才发现 问题 所在。原来是执行命令后还要输入数据密码的,这就是我说的那个大坑。我马上就想到再用Runtime.ge... 本文转自:http://blog.chinaunix.net/uid-354915-id-3504632.html 一、 pg _ dump 的用法: 数据库 的导入导出是最常用的功能之一,每种 数据库 都提供有这方面的工具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysql dump ,而 PostgreSQL 提供的对应工具为 pg _ dump pg _restore。