MySQL Xampp dump-import in Java

Olli123

Mitglied
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
 

m0nk3y

Mitglied
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
 

Olli123

Mitglied
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?
 
S

Spacerat

Gast
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:

m0nk3y

Mitglied
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.
 

Olli123

Mitglied
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!
 
S

Spacerat

Gast
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.
 

Olli123

Mitglied
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!
 
S

Spacerat

Gast
Eine weitere Möglichkeit wäre es, den Dumpfile zu parsen und per jdbc zu importieren. Ist meines Erachtens ohnehin sauberer.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Eine Spalte in xampp als Typ array erstellen - ein array mit "insert" hinzufügen. Datenbankprogrammierung 3
C XAMPP öffentlich zugänglich machen Datenbankprogrammierung 6
F XAMPP max connections problem Datenbankprogrammierung 6
H MySQL Datenbank auf Xampp nimmt keine Mediumblob an. Datenbankprogrammierung 0
K MySQL LAN-MySQL Server mit XAMPP Datenbankprogrammierung 2
J xampp Datenbank zugreifen mit Java Datenbankprogrammierung 2
S Kontroll-Logik MySQL in XAMPP: Zusammengesetzter Primarschlüssel aus Fremdschlüsseln Datenbankprogrammierung 5
T XAMPP MySQL-Passwort Datenbankprogrammierung 3
K Datenbankverbindung zu MySQL in XAMPP Datenbankprogrammierung 11
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
P MySQL Java Programm als Dienst MySQL Dump zurück spielen Datenbankprogrammierung 4
O MySQL mit Java Sql-Dump bekommen Datenbankprogrammierung 6
A MySQL Dump Datenbankprogrammierung 10
C Java, Postgres und dump. Datenbankprogrammierung 2
baykara MySQL CSV IMPORT Datenbankprogrammierung 6
M CSV Import - Dynamisches SQL Statement Datenbankprogrammierung 15
C Über Classpath MongoDB Treiber einbinden und korrekte import Pfade Datenbankprogrammierung 8
M MySQL MySQL DATETIME-Import Datenbankprogrammierung 9
A Problem mit dem Import und Export von Bildern Datenbankprogrammierung 4
O import in die Datenbank mit Threading Datenbankprogrammierung 3
T Datei import und Datumsformat Datenbankprogrammierung 4
A The import javax.persistence cannot be resolved Datenbankprogrammierung 1
G Import einer csv-Datei in eine H2-Database Datenbankprogrammierung 12
L HSQLDB sichern (import und export von DB) Datenbankprogrammierung 3
G import Oracle.jdbc*; Datenbankprogrammierung 6
A DTS Export/Import MS-SQL Server 2000 Datenbankprogrammierung 3

Ähnliche Java Themen


Oben