2016-05-02 25 views
2

これは、Javaでpg_dump 9.3を使用してデータベースをバックアップするために使用しているコードです。 私の問題は、常に結果ファイルが空で、終了コードが1だということです。 psqlについてはjavaを使用してpostgresデータベースをバックアップする方法

public static void backupDb() throws IOException, InterruptedException { 
    Runtime rt = Runtime.getRuntime(); 
    Process p; 
    ProcessBuilder pb; 
    rt = Runtime.getRuntime(); 
    pb = new ProcessBuilder(
      "C:\\Program Files\\PostgreSQL\\9.3\\bin\\pg_dumpall.exe", 
      "--host", "localhost", 
      "--port", "5432", 
      "--username", "postgres", 
      "--no-password", 
      "--format", "custom", 
      "--blobs", 
      "--verbose", "--file", "D:\\service_station_backup.backup", "service_station"); 
    p = pb.start(); 
    p.waitFor(); 
    System.out.println(p.exitValue()); 
} 
+1

が、なぜ、あなたはここにJavaを使用していますか? – e4c5

+0

プロセス/アプリケーションは、ファイル場所@Abdelwahhabへの書き込みアクセス権を持っていますか?例えば、プロセスのユーザIDは何ですか?また、ユーザIDは出力ファイルにアクセスできますか? – pnorton

+0

@pnortonはい、プロセスは出力ファイルにアクセスできますが、ファイルは正しく作成されますが、コンテンツはダンプされません。私は問題がpostgresサーバーのパスワードと思う。 – Wolverine219

答えて

0

は、 "長いオプションは、" 等号が必要になります=。だから、それは例えば--host=localhost。そのために、あなたは、ProcessBuilderを単一の文字列引数として、これらの引数を渡す必要があります。

pb = new ProcessBuilder(
     "C:\\Program Files\\PostgreSQL\\9.3\\bin\\pg_dumpall.exe", 
     "--host=localhost", 
     "--port=5432", 
     "--username=postgres", 
     "--no-password", 
     "--format=custom", 
     "--blobs", 
     "--verbose", "--file=D:\\service_station_backup.backup", "service_station"); 

あなたはまた、psqlから任意のエラーメッセージを参照してくださいProcessBuilder.getErrorStream()を使用したProcessBuilderのエラー出力をキャプチャする必要があります。

fe_sendauthを::パスワードが供給されていない

おそらく


編集

あなたが得るエラーメッセージ(getInputStream()を使用して)だけでなく、通常の出力をキャプチャしたいです

は、パスワードを入力する必要があることを意味します。

あなたはpg_dumpのためにconnection URLを渡すことによってそれを行うことができます。

pb = new ProcessBuilder(
     "C:\\Program Files\\PostgreSQL\\9.3\\bin\\pg_dumpall.exe", 
     "--dbname=postgres://postgres:[email protected]/postgres", 
     "--format=custom", 
     "--blobs", 
     "--verbose", "--file=D:\\service_station_backup.backup", "service_station"); 
+0

こんにちは、私は試してみてくれてありがとうあなたがアドバイスしたものの、同じ結果が得られ、同じメッセージがプロセスErrorStream: "fe_sendauth:no password supplied"から取得されます。 – Wolverine219

+0

パスワードを入力する必要があります。 'PGPASSWORD'環境変数を設定するか、' pgpass.conf'で設定するか、または接続URLを指定してください。詳細は、マニュアルを参照してください。http://www.postgresql.org/docs/9.3/static/libpq-connect.html#AEN39257 –

2

皆さん、ありがとうございました。最終的に完璧なコードが見つかりました。

public static void exportDb2() throws IOException, InterruptedException { 
    Runtime rt = Runtime.getRuntime(); 
    Process p; 
    ProcessBuilder pb; 
    rt = Runtime.getRuntime(); 
    pb = new ProcessBuilder(
      "C:\\Program Files\\PostgreSQL\\9.3\\bin\\pg_dump.exe", 
      "--host", "localhost", 
      "--port", "5432", 
      "--username", "postgres", 
      "--no-password", 
      "--format", "custom", 
      "--blobs", 
      "--verbose", "--file", "D:\\service_station_backup.backup", "service_station"); 
    try { 
     final Map<String, String> env = pb.environment(); 
     env.put("PGPASSWORD", "admin"); 
     p = pb.start(); 
     final BufferedReader r = new BufferedReader(
       new InputStreamReader(p.getErrorStream())); 
     String line = r.readLine(); 
     while (line != null) { 
      System.err.println(line); 
      line = r.readLine(); 
     } 
     r.close(); 
     p.waitFor(); 
     System.out.println(p.exitValue()); 

    } catch (IOException | InterruptedException e) { 
     System.out.println(e.getMessage()); 
    } 
} 
関連する問題