PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ripristina il database PostgreSQL usando java

È sorprendente che il comando che mostri funzioni, dal momento che non riesci a citare gli spazi nel percorso del comando. Prova:

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

Modifiche:

  • Convertire il modulo a stringa singola nel modulo array di argomenti molto più sicuro di exec chiamare;
  • Raddoppia le barre rovesciate nel rawDatabase percorso poiché il comando originale non riesce a evitare le barre inverse, quindi \r è un ritorno a capo nella stringa invece del \ char seguito da r car.
  • Passa a barre inverse raddoppiate invece di barre in avanti nel percorso del programma per coerenza. Questa modifica probabilmente non ha importanza.

Controlla anche lo stato di restituzione del processo. Devi utilizzare Process.waitFor() quindi, una volta terminato, utilizzare Process.exitValue() per determinare il risultato. Dovresti esaminare lo stderr e lo stdout catturati dal Process oggetto per errori e informazioni di registrazione.

Il motivo per cui il tuo programma continua a non funzionare è probabilmente perché:

  • Hai un vecchio pg_restore processi in giro tenendo serrature; e/o
  • Non stai consumando stdout e stderr quindi pg_restore esaurisce lo spazio di pipe nel buffer e blocca la scrittura sul flusso di output.

Sarà tutto molto più semplice se usa ProcessBuilder invece . ProcessBuilder ti consente di fornire flussi di file su cui scrivere l'output e generalmente si occupa molto di questo per te. Devi comunque attendere che il processo termini e controllare il suo codice di ritorno.