Java - Ejecutar comando desde Java

 
Vista:

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 04/09/2013 12:11:23
Hola a todos.

Necesito hacer una aplicación Java que realice una copia de seguridad de una base de datos MySQL.

El código es el que pongo a continuación, y el comando es correcto porque lo ejecuto desde una consola y funciona perfectamente. Pero si ejecuto este código, no hace nada...

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.*;
 
public class Tests {
	public static void main(String args[]) throws IOException {
		try {
		    String command = "mysqldump --opt --password=pass --user=root nombre_bbdd > C:\\Seguridad\\Copia_seguridad_20130904.sql";
		    Runtime.getRuntime().exec(command);
 
		} catch (IOException e) {
			System.out.println("Error: "+e);
		}
	}
}

Alguien puede ayudarme??

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 04/09/2013 15:28:46
Buenas,

La mejor forma de saber lo que pasa es que imprimas en consola el error que devuelve el comando al ejecutarse:

String line;
Process p = Runtime.getRuntime().exec(command);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.err.println(line);
}
input.close();

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 05/09/2013 11:05:11
El error que me sale incluyendo el código que me indicas es el siguiente:

-- MySQL dump 10.11
--
-- Host: localhost Database: bd1_wsn
-- ------------------------------------------------------
-- Server version 5.0.51b-community-nt-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

Sabes qué puede estar ocurriendo????

Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 05/09/2013 11:34:57
Buenas,

Pues hoy me he dejado la bola de cristal en casa, asi que no, no tengo ni idea :-)

Pero viendo el comando que ejecutas:
mysqldump --opt --password=pass --user=root nombre_bbdd > C:\\Seguridad\\Copia_seguridad_20130904.sql

Has probado si sera que no escapa bien los separadores de la ruta? Quizas funcione si pones C:/Seguridad/Copia_seguridad_20130904.sql

Donde pone nombre_bbdd en realidad no deberias poner el nombre de tu base de datos? (creo que es bd1_wsn no?)

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 05/09/2013 11:39:58
Sé que el comando es correcto porque lo ejecuto tal cual en consola y funciona bien. Sí, en nombre_bbdd pongo el nombre correcto.

El comando está bien, pero no sé porque a través de java no hace nada...

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 05/09/2013 13:55:19
Pero has probado lo de los separadores de ruta que te comentaba?

En cualquier caso la salida parece correcta, el comando se llama correctamente:

http://www.electrictoolbox.com/backing-up-mysql-with-mysqldump/

Pero es como si no encontrase tablas a volcar en la base de datos.

Cual es la salida que te da cuando ejecutas desde consola?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 05/09/2013 14:14:29
Tambien puede ser que no le estes danto tiempo a terminar el proceso. Haz un waitFor:

int processComplete = p.waitFor();

Justo despues de la linea:
Process p = Runtime.getRuntime().exec(command);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 05/09/2013 16:12:17
Ese comando en consola no devuelve nada, lo que hace es crear el archivo en el directorio que se indica.

He puesto la línea del waitFor donde me has indicado, pero sigue igual... :-( no crea el archivo. Yo también pensé que no le doy tiempo a terminar el proceso, pero no sé como hacer para dar más tiempo...

import java.io.*;

public class Tests {
public static void main(String args[]) throws IOException, InterruptedException {
try {
String command = "mysqldump --opt --password=contraseña --user=root bd1_wsn > C:\\Seguridad\\file.sql";
Process p = Runtime.getRuntime().exec(command);
int processComplete = p.waitFor();
System.out.println("processComplete = " + processComplete);

String line;
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.err.println(line);
}
input.close();

} catch (IOException e) {
System.out.println("Error: "+e);
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 05/09/2013 18:26:09
Y que valor te retorna el processComplete?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 05/09/2013 19:30:33
La causa y solución a tu problema está aquí:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

(a partir de "Runtime.exec() is not a command line")

Lo que viene a decir es que no puedes tomar el exec como un interprete de comandos por lo que cosas como los pipes o los operadores de redirección (< y >) no funcionan.
La escritura al fichero la debes hacer por tanto programáticamente tu mismo. Ya tienes la salida del comando, por lo que sólo te queda guardarla en un fichero con java.io/Printwriter, por ejemplo.

O... si te resulta más fácil, cambiar esto:
> C:\\Seguridad\\file.sql
Por esto:
--result-file=C:\\Seguridad\\file.sql

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 06/09/2013 13:55:07
Muchas gracias!!! Con esa modificación al menos ya crea el archivo :-)

Ahora me surge otro problema que voy a indagar cuál puede ser el problema... Y es que me da error al importa el archivo .sql con el software MySQL Workbench... me sale esto:

13:49:59 Restoring C:\Seguridad\file2.sql

Running: mysql.exe --defaults-extra-file="c:\users\admini~1\appdata\local\temp\tmppuyngt.cnf" --host=localhost --user=root --port=3306 --default-character-set=utf8 --comments < "C:\\Seguridad\\file2.sql"

ERROR 1046 (3D000) at line 22: No database selected


Operation failed with exitcode 1

13:50:00 Import of C:\Seguridad\file2.sql has finished with 1 errors

Sabes porqué ocurre eso?

Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 06/09/2013 15:33:49
Justo antes del < "C:\\Seguridad\\file2.sql" hay que poner el nombre de la base de datos y por eso no funciona
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 09/09/2013 08:55:12
En el entorno MySQL Workbench no introduzco ningún comando ni nada, es todo entorno gráfico. Al importar el archivo file2.sql es cuando sale el error que puse anteriormente...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar comando desde Java

Publicado por UnoPorAhi (128 intervenciones) el 09/09/2013 16:20:03
Yo no he usado ese programa en mi vida. Esto no tiene entonces nada que ver con java sino con el uso de un programa.

Pon entonces tu consulta en el foro de MySQL a ver si te pueden ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar comando desde Java

Publicado por Cris (48 intervenciones) el 10/09/2013 08:34:38
Vale, seguiré tu consejo. Muchísimas gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar