1

次のコードを使用して、Javaを使用してPostgreSQLデータベースを復元します

 Runtime r = Runtime.getRuntime();
 Process p;
 String cmd ="D:/Program Files/PostgreSQL/9.1/bin/pg_restore.exe --host localhost --port 5432 --username postgres --dbname mytestqq --role postgres --no-password  --verbose D:\sathish\rawDatabase.backup";
 p = r.exec(cmd);

rawDatabase.backup ファイルに 42 個のテーブルがありますが、1 つのテーブルだけが復元されます。なぜ残りのテーブルはコードで何が問題なのですか? 前もって感謝します!!!!

4

3 に答える 3

7

コマンドパスのスペースを引用していないため、表示するコマンドがまったく機能するのは驚くべきことです。試す:

String[] cmd = {
    "D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
    "--host", "localhost",
    "--port", "5432",
    "--username", "postgres",
    "--dbname", "mytestqq",
    "--role", "postgres",
    "--no-password",
    "--verbose",
    "D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);

変更点:

  • 単一文字列形式をより安全な引数配列形式のexec呼び出しに変換します。
  • rawDatabase元のコマンドがバックスラッシュのエスケープに失敗したため、パス内のバックスラッシュを 2 倍にします。つまり、char の後にchar が続く\rのではなく、文字列内のキャリッジ リターンです。\r
  • 一貫性を保つために、プログラム パスでスラッシュの代わりに二重のバックスラッシュに切り替えます。この変更はおそらく重要ではありません。

また、プロセスの返却ステータスも確認してください。結果を判断するには、Process.waitFor()使用を終了したら then を使用する必要があります。Process.exitValue()オブジェクトによってキャプチャされた stderr と stdoutProcessで、エラーとログ情報を調べる必要があります。

プログラムが引き続き動作しない理由は、おそらく次のとおりです。

  • ロックを保持している古いpg_restoreプロセスがぶら下がっています。および/または
  • stdout と stderr を消費していないためpg_restore、バッファリングされたパイプ スペースが不足し、出力ストリームへの書き込みがブロックされます。

代わりにを使用するProcessBuilderと、これはすべてはるかに簡単になります。ProcessBuilder を使用すると、出力を書き込むためのファイル ストリームを提供でき、通常はこれの多くを処理します。ただし、プロセスが終了してリターンコードを確認するまで待つ必要があります。

于 2013-04-01T12:37:03.970 に答える
0

次のコードは、JAVA コードを使用して postgres DB ダンプを取得する際に完全に機能します。これを試してください。

List<String> cmds = new ArrayList<String>();
         cmds.add("C:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_dump.exe");
         cmds.add("-i");
         cmds.add("-h");
         cmds.add("localhost");
         cmds.add("-p");
         cmds.add("5432");
         cmds.add("-U");
         cmds.add("YOUR PG USERNAME");
         cmds.add("-F");
         cmds.add("c");
         cmds.add("-b");
         cmds.add("-v");
         cmds.add("-f");
         cmds.add("\"E:\\pg_dump.backup\"");//Location to store db Dump backup
         cmds.add("lmd");
         ProcessBuilder process = new ProcessBuilder();
         process.command(cmds).start();
于 2013-07-16T13:04:32.697 に答える