2010-09-28 37 views
6

在我們的應用程序中,我們實現了從代碼中觸發的自動DB遷移。現在我們想在做任何遷移之前備份現有的數據庫。如何通過JDBC從Postgresql-DB執行備份?

誰能解釋如何從Java代碼中做通過JDBC一個PostgreSQL-DB的完整備份?

更新:它不通過JDBC工作。

下面一些工作代碼的Frank Heikens響應:

final List<String> baseCmds = new ArrayList<String>(); 
    baseCmds.add("/usr/bin/pg_dump"); 
    baseCmds.add("-h"); 
    baseCmds.add("hostname"); 
    baseCmds.add("-p"); 
    baseCmds.add("5432"); 
    baseCmds.add("-U"); 
    baseCmds.add("username"); 
    baseCmds.add("-b"); 
    baseCmds.add("-v"); 
    baseCmds.add("-f"); 
    baseCmds.add("/path/to/backup.sql"); 
    baseCmds.add("dbName"); 
    final ProcessBuilder pb = new ProcessBuilder(baseCmds); 

    // Set the password 
    final Map<String, String> env = pb.environment(); 
    env.put("PGPASSWORD", "password"); 

    try { 
     final Process process = pb.start(); 

     final BufferedReader r = new BufferedReader(
        new InputStreamReader(process.getErrorStream())); 
     String line = r.readLine(); 
     while (line != null) { 
      System.err.println(line); 
      line = r.readLine(); 
     } 
     r.close(); 

     final int dcertExitCode = process.waitFor(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException ie) { 
     ie.printStackTrace(); 
    } 

回答

6

爲什麼不使用pg_dump

+0

因爲當我使用的ProcessBuilder開始pg_dump的一樣,pg_dump無法訪問文件中寫入轉儲成:( – boutta 2010-09-28 13:49:56

+0

然後pg_dump的輸出傳輸到另一個位置。pg_dump的是進行備份的唯一安全的方法,所有的人(除了PITR )會失敗,並且在最壞的時刻失敗 – 2010-09-28 14:21:38

+0

這也沒有奏效,它遇到了阻塞讀取,我解決了這個問題,指定了沒有任何「或」的文件名。 – boutta 2010-09-28 14:37:51

0

我用DbUnit對數據庫的備份從我的Java應用程序中:

的DbUnit具有出口能力和進口您的數據庫數據往返於XML數據集。從版本2.0開始,DbUnit可以在流模式下使用非常大的數據集。

+0

DbUnit不轉儲SQL。但我在原始問題中沒有講過。 – boutta 2010-09-28 13:51:13

+1

答案中提到的鏈接不起作用。 – Blip 2016-04-09 13:19:16