sql >> データベース >  >> RDS >> PostgreSQL

Javaを使用してPostgreSQLデータベースを復元する

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

    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倍にします 元のコマンドは円記号をエスケープできないため、パス。 \ r \ではなく文字列のキャリッジリターンです charの後にrが続く char。
    • 一貫性を保つために、プログラムパスでスラッシュではなく円記号を2つに切り替えます。この変更はおそらく問題ではありません。

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

    プログラムが引き続き機能しない理由は、おそらく次の理由によるものです。

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

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



    1. 3つのIDで検出されたすべての一意の組み合わせを継続的に挿入します

    2. SQL_Variantデータ型を使用する必要がありますか?

    3. PL-SQLエラーでの選択:選択後のINTO

    4. ファイルまたはアセンブリを読み込めませんでした'MySql.Data、Version =6.2.2.0