El otro día tuve un montón de problemas queriendo respaldar una base de datos desde portgres, pedi ayuda a los broders del grupo de ubuntu y el prix Igor me ayudo bastante, hasta el punto que lo que el mae me paso lo combine con otra cosa que habia leído en internet y me soluciono el problema.
Anteriormente pensaba que hacer el respaldo iba a se mas facil, pero habia un problema, que al ejecutar el comando de respaldo, el servidor postgres se queda esperando que el usuario introduzca la contraseña, lo cual yo no sabia como pasar de parámetro, tons, la forma de hacerlo fue asi miren el codigo:
Anteriormente pensaba que hacer el respaldo iba a se mas facil, pero habia un problema, que al ejecutar el comando de respaldo, el servidor postgres se queda esperando que el usuario introduzca la contraseña, lo cual yo no sabia como pasar de parámetro, tons, la forma de hacerlo fue asi miren el codigo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
try { | |
String path = "ruta_donde_repaldar" | |
Runtime r = Runtime.getRuntime(); | |
//PostgreSQL variables | |
String user = "postgres"; | |
String dbase = "base_datos"; | |
String password = "tu_clave"; | |
Process p; | |
ProcessBuilder pb; | |
/** | |
* Ejecucion del proceso de respaldo | |
*/ | |
r = Runtime.getRuntime(); | |
pb = new ProcessBuilder("pg_dump", "-v", "-D", "-f", path, "-U", user, dbase); | |
pb.environment().put("PGPASSWORD", password); | |
pb.redirectErrorStream(true); | |
p = pb.start(); | |
} catch (Exception e) { | |
} |
Lo que se hace es crear un proceso con el comando de pg_dump que es el encargado de respaldar lo que hay en el server de postgres y establecer una variable de entorno (PGPASSWORD), dicha variable es la que almacena la clave del usuario de postgres que esta tratando de conectarse, tons, asunto resuelto, de esta forma es como pasarle la clave en forma de parametro.
Espero les sirva, para consultas, jeje, dejen su comentario.
17 comentarios:
Hola! Excelente blog! He hecho pequeñitas modificaciones a tu codigo, y lo he publicado... (javierscappini.blogspot.com)
Exitos y Adeltante!
"Sigue con la mente abierta y la imaginacion indomita!"
Javier Scappini.
ok, me voy a dar una vuelta por el tuyo.
Saludos
¿No está repetida la llamada a getRuntime?
r = Runtime.getRuntime();
Si hace falta ponerla las 2 veces, ¿podrías explicar por qué?
creo que tenes razon, la sentencia
r = Runtime.getRuntime(); está repetida sin ningún sentido.
Gracias por la aclaración, la verdad es que no me fije. Voy a corregirlo
Saludos, me parece muy bueno tu codigo y muy facil de entender, pero al copiarlo y compilarlo me surgio un poblemita con el ProcessBuilder, me gustaria saber que clase en especial tengo que imnportar para que funcione?, hasta luego gracias.
Hola !
Primero muy bueno el ejemplo, me sirvió de mucho. Quisiera preguntarles algo; hice el mismo ejemplo, con parámetros distintos, para restaurar la base de datos. EL tema es que a veces funciona bien, y a veces no. Cuando no me restaura bien no me tira ninguna una excepción … es decir me la oculta … hay algún modo qué desde Java pueda ver la execpción que me esta tirando ?,
Muchas gracias
Damián
Hola,
Me parece muy bueno el apunte sobre el ProcessBuilder desde hace un tiempo andaba buscando algo asi.
Hice una modificaciones al codigo para obtener lo que queria, asi me ha funcionado. Muchs Gracias.
Como mencione, con las modificaciones realizadas me ha funcionado y ademas he hecho una pequeña apliacion que maneja las copias de seguridad, si alguien esta interesado en los fuentes del programa escriba a la direccion calojamatt@dessoft.4t.com
Hola, me sirvieron mucho tu código, lo he mejorado y expandido al punto de crear una librería .jar, te invito a que la revises http://zagal-jmusic.blogspot.com/2010/02/dbtools-backup-automaticos-y-otros.html
Saludos...
Hola, hay manera de hacerlo desde un cliente¿?
saludos y gracias.
hola , ktal un saludo. Bueno mi pregunta es la "r", del
Runtime r = Runtime.getRuntime();
q hace??
Hola Buenos días, para descargar el código sólo está la opción de Megaupload y por culpa de la SOPA no se puede descargarpodrías enviarmelo a mi correo marv.lopez@hotmail.com
Gracias de antemano
Hola, te quería felicitar por este excelente trabajo, me sirvió bastante.. sigue adelante con ese mismo animo y dedicación..
Att. Diego.
hola disculpa el código que dejaste publicado lo copie en netbeans pero me marca este error java.io.IOException: Cannot run program "pg_dump": CreateProcess error=2, El sistema no puede encontrar el archivo especificado
me gustaría que me ayudaran a corregirlo
Sucede porque debes decirle la ruta completa donde se encuentra el mi caso seria (Linux):
/opt/PostgreSQL/9.3/bin/pg_dump
Me ayudo mucho su aporte sobre todo despues de intentar en documentacion sin encontrar un camino corto. Pero no supe como pasar el parametro -h con la direccion del servidor de datos pues intente colocandolo igual que en el pg_dump nativo del postgres pero no obtuve ningun resultado con : ("pg_dump", "-v", "-f", path, "-h" , "192.168.0.28" , "-U" , user , "-t" , tabla, "-a" , basededatos) pero si no coloco la direccion del servidor con -h y uso una base de datos local entonces si hace el vaciado de datos no se si me puede ayudar a ver donde esta el problema pues yo intente colocarlo como lo hago normalmente y no me funciono dentro del processBuilder.'gracias
Me ayudo mucho su aporte sobre todo despues de intentar en documentacion sin encontrar un camino corto. Pero no supe como pasar el parametro -h con la direccion del servidor de datos pues intente colocandolo igual que en el pg_dump nativo del postgres pero no obtuve ningun resultado con : ("pg_dump", "-v", "-f", path, "-h" , "192.168.0.28" , "-U" , user , "-t" , tabla, "-a" , basededatos) pero si no coloco la direccion del servidor con -h y uso una base de datos local entonces si hace el vaciado de datos no se si me puede ayudar a ver donde esta el problema pues yo intente colocarlo como lo hago normalmente y no me funciono dentro del processBuilder.'gracias
Publicar un comentario