PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Stellen Sie die PostgreSQL-Datenbank mit Java wieder her

Es ist überraschend, dass der von Ihnen gezeigte Befehl überhaupt funktioniert, da Sie die Leerzeichen im Befehlspfad nicht anführen. Versuchen Sie:

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);

Änderungen:

  • Konvertieren Sie die Einzelstring-Form in die viel sicherere Argument-Array-Form von exec anrufen;
  • Verdoppeln Sie die Backslashes in der rawDatabase Pfad, da Ihr ursprünglicher Befehl Backslashes nicht maskiert, also \r ist ein Carriage Return in der Zeichenfolge anstelle von \ char gefolgt von r Zeichen
  • Wechseln Sie aus Gründen der Konsistenz zu doppelten umgekehrten Schrägstrichen anstelle von Schrägstrichen im Programmpfad. Diese Änderung spielt wahrscheinlich keine Rolle.

Überprüfen Sie auch den Rückgabestatus des Prozesses. Sie müssen Process.waitFor() Verwenden Sie nach dem Beenden Process.exitValue() um das Ergebnis zu bestimmen. Sie sollten die vom Process erfassten stderr und stdout untersuchen Objekt für Fehler und Protokollinformationen.

Der Grund, warum Ihr Programm weiterhin nicht funktioniert, ist wahrscheinlich folgender:

  • Du hast altes pg_restore Prozesse, die herumhängen und Sperren halten; und/oder
  • Sie verbrauchen stdout und stderr nicht, also pg_restore hat keinen gepufferten Pipe-Platz mehr und blockiert das Schreiben auf dem Ausgabestream.

Dies wird alles viel einfacher, wenn Sie verwenden Sie ProcessBuilder stattdessen . Mit ProcessBuilder können Sie Dateistreams bereitstellen, in die Ausgaben geschrieben werden können, und übernimmt im Allgemeinen einen Großteil davon für Sie. Sie müssen trotzdem warten, bis der Prozess beendet ist, und seinen Rückgabecode überprüfen.