2010-07-22 48 views
0

我在很多地方看到過這個問題,也就是說用PostgreSQL進行編程備份的問題。我的解決方案是使用ExpectJ,但我無法讓我的代碼工作。如何使用ExpectJ在Java中調用pg_dump(在PostgreSQL 8.4上)?

我有以下代碼:

public class BackupUtility 
{ 
public static void main(String[] args) 
{ 

    try 
    { 
    ExpectJ exp = new ExpectJ(20); 
    Spawn shell = exp.spawn("\"C:\\Program Files\\PostgreSQL\\8.4\\bin\\pg_dump.exe\" " + 
          "-h localhost -U myUserName myDB"); 
    shell.expect("Password: "); 
    shell.send("myPassword"); 

    System.out.println(shell.getCurrentStandardOutContents()); 

    shell.expectClose() 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 
} 

然而,在shell.expect線,它的超時。

當我運行在命令提示符下此命令,它看起來像如下:

C:\ Documents和Settings \ bobjonesthe3rd> 「C:\ Program Files文件\的PostgreSQL \ 8.4 \ BIN \ pg_dump的」 -h localhost -U myUserName myDB
密碼:

所以,我知道它提示輸入密碼,但ExpectJ由於某種原因沒有收到提示。

任何幫助將不勝感激。

謝謝, 馬特

回答

1

我敢肯定這樣做更簡單的方法,而不需要使用期望和發送,是通過.pgpass file。也在pg_dump docs中引用。

+0

我沒有訪問實際的PostgreSql安裝,因此使用.pgpass文件不是一個可行的選項。帖子中的「localhost」主機就是一個例子。 PostgreSQL通常會運行在不同的機器上。 – 2010-07-23 13:56:00

+0

然後你很複雜的事情。如果您連接的PG版本比您的pg_dump更新,您的備份可能不會像您期望的那樣行事。 – rfusca 2010-07-23 14:06:04

+0

這是我們的設置:我們有一個使用PostgreSQL作爲數據庫服務器的桌面應用程序。作爲安裝程序的要求,用戶必須安裝PostgreSQL 8.4。他們給我們的服務器名稱和端口號,我們使用這些信息連接到他們的服務器。在我們的安裝中,我們包含了一個pg_dump實用程序的副本,並將它與其服務器信息一起用於備份。但是,這一切都是無關緊要的。我的問題不是關於如何進行備份,而是關於如何使用ExpectJ。 – 2010-07-23 15:02:25

相關問題