MySQL Xampp dump-import in Java

  • Themenstarter Themenstarter Gelöschtes Mitglied 28048
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 28048

Gast
Hallo!

Ich möchte über Xampp ein Dump-File, welches ich zuvor gedownloaded habe, importieren, sodass ich später auf die "frische" Datenbank zugreifen kann. Dazu habe ich eine entsprechenden CMD-Befehl gefunden, welchen ich dann in eine Java-Syntax umgewandelt habe. Hier mal der entsprechende Ausschnitt:

Java:
Runtime rt = Runtime.getRuntime();
Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysql -uuser -ppass --database=databasex < C:\\ordner\\unterordner\\test.sql");

user, pass und databasex sind die relevanten daten die ich hier nur entsprechend geändert habe.

Das Paradoxe ist, dass dieser Befehl, den ich mir per
Java:
System.out.println();
aus Testgründen ausgeben habe lassen, im cmd ohne Probleme funktioniert... Lediglich über Java entsteht da ein Problem. Fehlermeldungen: Fehlanzeige ...

Fällt euch da etwas ein, warum es nicht klappt?

Hab schon rumgesucht und bin leider auf kein Ergebnis gekommen. :bahnhof:



Vielen Dank für eure Hilfe

Olli123
 
Ich verwende zwar kein XAMPP aber mysql ist mysql. Ein Problem ist der user-Parameter. Wenn du die Kurzform verwendest (-u) muss meines Wissens nach zwischen dem Parameter und dem Wert ein Leerzeichen stehen (ausser beim Passwort! -pMEINPASSWORT).

Java:
Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysql -u user -ppass --database=databasex < C:\\ordner\\unterordner\\test.sql");

Mögliche Fehlermeldungen kannst über die Process-Streams auslesen:

Java:
InputStream is = child.getInputStream(); // Refernz auf std-out
InputStream es = child.getErrorStream();

Mit dem ersten InputStream erhälst du eine Referenz auf std-out. Da steht also quasi das drin was du in der Eingabeaufforderung sehen würdest wenn du den Befehl eingibst und Return drückst. Sollte beim Einspielen ein Fehler auftreten müsste die entsprechende Ausgabe also in diesem Stream zu finden sein. Ich hoffe das hilft dir weiter.

m0nk3y
 
Vielen Dank für deine Antwort, aber an dem Leerzeichen dazwischen lag es leider nicht... Wie gesagt das komische ist, wenn ich den Befehl 1 zu 1 kopiere und in den cmd einfüge macht er mir es ohne Probleme. Nur Java stellt sich da ein wenig doof an. Den Inputstream habe ich versucht auszulesen, aber er ist verursacht eine Endlosschleife beim Auslesen.

Noch jemand eine Idee woran es liegen könnte?
 
Die Fehlermeldung müsste man sich mal ansehen können. Vllt. versuchst es mal mit dem Java-Internen File-Separator "/", glaub' aber kaum, dass es daran liegt. Evtl. kann aber auch die Umleitung "<" in Java zu dieser Fehlermeldung führen, zu solchen Zwecken hat man soweit ich weis nämlich noch den OutputStream des Prozesses (siehe hier).
 
Zuletzt bearbeitet von einem Moderator:
Evtl. kann aber auch die Umleitung "<" in Java zu dieser Fehlermeldung führen, zu solchen Zwecken hat man soweit ich weis nämlich noch den OutputStream des Prozesses (siehe hier).

Jetzt wo du es sagst... 🙂
Ich habe letztens auch vor dem gleichen Problem gestanden. Und genau daran hats gelegen. Versuch mal sowas in der Art:

Java:
Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysql -uuser -ppass --database=databasexl");
OutputStream processOutputStream = child.getOutputStream();

Path backup = FileSystems.getDefault().getPath("C:\\ordner\\unterordner\\test.sql");
Charset charSet = Charset.forName("UTF-8");
String line = null;
            
try (BufferedReader reader = Files.newBufferedReader(backup, charSet)) 
{                       
    while ((line  = reader.readLine()) != null)
    {
        processOutputStream.write(line.getBytes());               
    }
} 
catch (IOException x)
{
    x.printStackTrace();                                     
}
            
processOutputStream.flush();
processOutputStream.close();

So funktionierts wenigstens bei mir.
 
Nachdem ich jetzt auch noch ein wenig nachgeschaut habe, glaube ich auch immer mehr das es an der Umleitung "<" liegt.
Habe deinen Vorschlag mal so übernommen ein wenig angepasst, jedoch scheint Java auch diese Version bei mir nicht zu akzeptieren. Das File wird auf jeden Fall richtig eingelesen und dann dementsprechend auch in den processOutputStream hineingeschrieben. Kann es daran liegen, dass ich mit:

Java:
Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysql -uuser -ppass --database=databasex");

den Befehl ausführe und dann CMD bereits da abbricht, da die entsprechende Umleitung bzw. in diesem Fall die Bytes des Files fehlen? Anders könnte ich mir es nicht erklären, warum es nicht funktioniert.

Aber vielen dank schonmal soweit!
 
Zerleg' doch wie im geposteten Link deinen String auch in ein Array und ruf' dann die entsprechende [c]exec()[/c] Methode auf.
Java:
String[] cmd = {
  "C:\\xampp\\mysql\\bin\\mysql",
  "-u user -ppass --database=databasex",
  "< C:\\ordner\\unterordner\\test.sql"
};
Process p = Runtime.getRuntime().exec(cmd);
Das tun die, weil es die andere Methode, welche nur einen String erwartet, sonst anhand von Leer- und anderen WhiteSpacezeichen ihrerseits tut und dann eben die, welche ein String-Array erwartet rekursiv aufruft.
 
Zerleg' doch wie im geposteten Link deinen String auch in ein Array und ruf' dann die entsprechende [c]exec()[/c] Methode auf.
Java:
String[] cmd = {
  "C:\\xampp\\mysql\\bin\\mysql",
  "-u user -ppass --database=databasex",
  "< C:\\ordner\\unterordner\\test.sql"
};
Process p = Runtime.getRuntime().exec(cmd);
Das tun die, weil es die andere Methode, welche nur einen String erwartet, sonst anhand von Leer- und anderen WhiteSpacezeichen ihrerseits tut und dann eben die, welche ein String-Array erwartet rekursiv aufruft.




Auch das habe ich jetzt gerade ausprobiert und es geht auch nicht :bahnhof:... ich versteh das ganze nicht... Wo habe ich da den Denkfehler?

Aber nochmal vielen Dank für die ganzen Antworten!
 
Weiß keiner mehr eine Möglichkeit, woran es liegt? Wäre echt sehr nett wenn mir jemand helfen könnte.


Viele Grüße

Olli123
 
Eine weitere Möglichkeit wäre es, den Dumpfile zu parsen und per jdbc zu importieren. Ist meines Erachtens ohnehin sauberer.
 

Zurück
Oben