# Befehl für mysqldump



## Randall (30. Dez 2004)

Ich möchte meine Datenbank mit einem mysqldump sichern.

Welcher Befehl ist dazu notwendig. Ich habe folgendes versucht:



```
String mysqldump = "mysqldump --opt suke > "+saveFile+".sql;";
```

wobei "saveFile" ein File ist, das mittels eines FileChoosers ausgewählt wurde.

ausgeführt wird der String mit:


```
savestmt.executeUpdate(mysqldump);
```

Das funktioniert aber nicht:

SQLException: SQLState(42000) vendor code(1064)
java.sql.SQLException: Syntax error or access violation message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 
'mysqldump --opt suke > C:\backup4.sql' at line 1"


Habe es auch schon anstelle von executeUpdate mit execute(mysqldump) versucht!

Wie führe ich diesen Befehl zur Sicherung der DB aus?


----------



## abollm (30. Dez 2004)

Was spricht gegen eine Sicherung der DB-Dateien auf der OS-Ebene?


----------



## DP (30. Dez 2004)

mysqldump wird auch nicht als statement ausgeführt sondern auf os ebene wie abollm geschrieben hat.

deinen befehl musste in der console eingeben


----------



## Randall (30. Dez 2004)

Sowas hab ich mir schon gedacht.

Ich möchte die Sicherung der DB aus einer Applikation über einen Menüpunk starten. Was gäbe es da für andere Möglichkeiten? Kann dem User nicht zumuten, sowas über die Konsole zu machen


----------



## Bleiglanz (30. Dez 2004)

SELECT * INTO OUTFILE <filename>

lies mal die Doku, da gibts noch mehr


----------



## Guest (30. Dez 2004)

Siehe mysqldump --help

Du musst über den Parameter -r den Namen der Datei angeben,
in die geschrieben werden soll. Pipes sind eine Funktionalität der
Shell, kannst sie nicht so direkt in Java verwenden.
Wenn überhaupt, dann über das Inputstream des Processes.


----------



## DP (30. Dez 2004)

Bleiglanz hat gesagt.:
			
		

> SELECT * INTO OUTFILE <filename>
> 
> lies mal die Doku, da gibts noch mehr



und dann?! da haste ja weder inserts, noch tabellenbeschreibungen...

wieso machste nicht einfach ne kopie vom mysql-verzeichnis, fertig. ist zwar "billig", aber effektiv 

ansonsten schau mal hier: http://www.databasejournal.com/features/mysql/article.php/3421751, dann kannste dich für einen weg entscheiden.


----------



## Randall (30. Dez 2004)

das mit dem mysql-Verzeichnis kopieren geht zwar im vorliegenden Fall, da diese nur aus der benötigten DB besteht. ABer wenn ich im mysql-Verzeichnis mehrere DB's habe, ist es nicht so gut, das ganze Verzeichnis zu kopieren, vor allem wenn es grosse DB's sind. Und ich möchte die App so bauen, dass sie auch für andere Fälle brauchbar ist.

Werd deinen Link mal studieren.


----------



## Randall (30. Dez 2004)

kann ich aus der App eine Batch-Datei ausführen? Das wäre eine möglichkeit, es für den User einfacher zu machen.


----------



## DP (31. Dez 2004)

unter windows z.b.:


```
String s = "E:\\backup\\mysql_";

File dir = new File(s);
try {
    if (!dir.exists()) {
        dir.mkdir();
    }
    Runtime.getRuntime().exec("cmd /c xcopy d:\\mysql " + s + " /E /V /C /F /H");
}
```


----------



## Randall (31. Dez 2004)

hm .. wenn ich das so entschlüssle, dann ist das um das gesamte Verzeichnis zu kopieren. 

Kannst du mir einen Link geben, um die Bedeutung von /E /V usw. zu bekommen?


----------



## Gast (31. Dez 2004)

ok .. habs rausgefunden


----------



## Bleiglanz (31. Dez 2004)

> und dann?! da haste ja weder inserts, noch tabellenbeschreibungen...


war ja nur eine Ideee

ausserdem braucht kann man sich die Tabellenbeschreibung leicht beschaffen (SHOW CREATE TABLE <ta>; oder man hat sie sonst noch irgendwo rumliegen!), und zum einlesen gibts LOAD DATA:



> The SELECT ... INTO OUTFILE 'file_name' form of SELECT writes the selected rows to a file. The file is created on the server host, so you must have the FILE privilege to use this syntax. The file cannot already exist, which among other things prevents files such as `/etc/passwd' and database tables from being destroyed. The SELECT ... INTO OUTFILE statement is intended primarily to let you very quickly dump a table on the server machine. If you want to create the resulting file on some client host other than the server host, you can't use SELECT ... INTO OUTFILE. In that case, you should instead use some command like mysql -e "SELECT ..." > file_name on the client host to generate the file. SELECT ... INTO OUTFILE is the complement of LOAD DATA INFILE; the syntax for the export_options part of the statement consists of the same FIELDS and LINES clauses that are used with the LOAD DATA INFILE statement. See section 13.1.5 LOAD DATA INFILE Syntax. FIELDS ESCAPED BY controls how to write special characters. If the FIELDS ESCAPED BY character is not empty, it is used to prefix the following characters on output:



muss halt für jede Tabelle einzeln gemacht werden (funzt aber wahrscheinlich nicht so gut für BLOBs)


----------



## EagleEye (31. Dez 2004)

ich hab das bei meinen progs einfach so gemacht das ich alle sachen abfrage und die von hand in ne tabelle eintrage
und die blobs werden jeweils in ne extra datei geschrieben so klappt das bei mir problemlos


----------



## seekingone (16. Jan 2008)

DP hat gesagt.:
			
		

> unter windows z.b.:
> 
> 
> ```
> ...



Gibt es mittlerweile evtl. eine Funktion in Java die das evtl graphisch Unterstützt?

Oder bin ich gezwungen mir so eine Art Dateimanager selber zu schreiben, wenn ich den Speicherort vom Benutzer bestimmen lassen möchte? Hat dafür jemand evtl. ein wenig Source auf Lager oder Verweise?


----------



## HoaX (16. Jan 2008)

JFileChooser


----------



## seekingone (16. Jan 2008)

@HoaX : Dankje well ! vor lauter DateiManager uebersehen


----------



## tuxedo (16. Jan 2008)

Wer seine Backups direkt unter Linux machen will: 

Hier ein kleines shell-script was bei mir per cronjob läuft:


```
#!/bin/bash
#
# Backup of all Databases in separate sql-files
#

path="/var/lib/mysql/"  # Pfadname in die MYSQL die Datenbanken ablegt, needs tailing '/'
pathlen=${#path};       # Länge der Pfadnamenstrings
targetpath="/opt/sqlbackup/backup"      # Target-directory in which the dumps are saved
rootuser="root"
password="meinrootpasswort"
echo "-------------------------------";
echo "sqlbackup v0.1 - alex0801";
echo "-------------------------------";
echo "";

for i in ls -d $path*/; do
        database=${i:pathlen}   # Den Pfad vom Dateinamen abschneiden
        dblen=${#database}
        if (($dblen >= 3))
        then
                database=${database:0:dblen-1}
                echo "-------------------------------";
                date
                echo "Erstelle Backup der Datenbank '${database}'"
                mysqldump --opt $database -u $rootuser -h localhost --password=$password > $targetpath/$database.sql
        fi
done
```

Damit wird pro DB eine SQL-File abgelegt ...
Ist zwar quick'n'dirty, funktioniert dafür aber schon seit fast 3 Jahren ohne Probleme.


- Alex


----------



## seekingone (17. Jan 2008)

nochmal eine Frage zum jFileChooser und einer MySQL DatenBank

kann ich den jFileChooser dahingehend modifizieren, dass der Benutzer nur den Speicherort für eine zuvor automatisch erstellte zip-Datei wählen soll.
Ich habe vor das Verzeichnis der entsprechenden DB im MySQL Verzeichnis einfach über java zu zippen und der Benutzer soll dann nur den Speicherort wählen, z.B.: USB-Stick

Ich wüsste sonst nicht wie ich einem Benutzer welcher nicht mit der Verzeichnisstruktur vertraut ist das sichern seiner Datenbank ermöglichen könnte. Die Anwendung läuft auf dem DB-Server oder DB-Server local, wie man es betrachten möche (XAMPP) auf einer WindowsKiste


----------

