# mysqldump funktioniert nicht



## X3TitanCore (23. Apr 2012)

Hi Leute,

ich bin so langsam am verzweifeln. Ich will über Java ein mysqldump machen, aber die Datei enthält immer nur das hier sonst nix:


```
-- MySQL dump 10.13  Distrib 5.1.41, for debian-linux-gnu (i486)---- Host: localhost    Database: dbname-- -------------------------------------------------------- Server version	5.1.41-3ubuntu12.10/*!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 */;
```

Kann da irgendeiner was mit anfangen. Die DB ist momentan 132 MB gross.

Vor kurzem hat noch alles funktioniert. 
Wenn ich den dump über die Konsole mache funktioniert es perfekt.

Gruss
Dirk


----------



## Atze (23. Apr 2012)

hast du ein beispiel an code?

wie machst du es über die konsole, und wie im code?


----------



## X3TitanCore (23. Apr 2012)

Hier die Code Schnipsel.

Konsole:


```
mysqldump -uusername -p`cat /etc/psa/.psa.shadow` DATENBANKNAME > DATEINAME.sql
```


Java:


```
String[] cmd = {
	     "mysqldump", 
                "-u" + MYSQL_BACKUP_USER, 
                "-p" + MYSQL_BACKUP_PASSWORD,
                "--databases", 
                DB_NAME, 
                backupPath
                };
		
		Runtime shell = Runtime.getRuntime();
		Process process = null;
		Writer fileWriter = null;
		
		try {
			File f = new File(backupPath);
			fileWriter = new FileWriter(f);
			process = shell.exec(cmd);
			process.waitFor();
			
			BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
			String line = null;
			
			while ((line = br.readLine()) != null) {
				fileWriter.write(line);
			}
			f.setLastModified(System.currentTimeMillis());
			br.close();
			
		} catch (IOException ex) {
			res = false;
			
			if (fileWriter != null) {
				try {
					fileWriter.close();
					
				} catch ( IOException e ) {
					
				}
			}
			new File(backupPath).delete();
			
		} catch (InterruptedException ie) {
			
		} finally {
			if (fileWriter != null) {
				try {
					fileWriter.close();
					
				} catch (IOException ex) {
					
				}
			}
		}
```

Gruss
Dirk


----------



## X3TitanCore (25. Apr 2012)

Weiss keiner was da falsch ist?


----------



## nillehammer (25. Apr 2012)

Ich weiß jetzt nicht, ob  das direkt falsch ist, aber das Kommando, dass Du direkt über die Konsole eingibst:

```
mysqldump -uusername -p`cat /etc/psa/.psa.shadow` DATENBANKNAME > DATEINAME.sql
```
unterscheidet sich, von dem, dass Dein Javaprogramm aufruft:

```
mysqldump -uMYSQL_BACKUP_USER -pMYSQL_BACKUP_PASSWORD --databases DB_NAME backupPath
```
Der Parameter --databases ist anders und backupPath muss doch auch nicht ein, oder?
Eine weitere Fehlerquelle kann der PATH sein. Wenn du Dich mit einem User auf Konsole einloggst, ist das MySql-Bin vielleicht im Pfad und man direkt mysqldump aufrufen. Im Java-Programm vielleicht nicht. Hier kann es helfen, den vollen Pfad zum Kommando einzugeben.


----------



## X3TitanCore (25. Apr 2012)

Hi!

Also ich habe es auch schon ohne --databases probiert, gleiches Ergebnis.

backupPath ist der Pfad wo das Backup gespeichert werden soll, während ich mit der Konsole schon im Verzeichnis war. Die Datei wird auch an der richtigen Stelle erzeugt mit dem Inhalt aus dem ersten Post.

Was mich wundert ist, dass in der Backupdatei was drin steht, aber nicht die kompletten Backupdaten. Von daher sollte der Pfad zu mysqldump passen. Es hatte ja auch schon mal funktioniert, nur jetzt nicht mehr.

Wenn ich raten müsste, würde ich auf die Größe der DB tippen. Weiss nur nicht wovon das abhängt.

MYSQL_BACKUP_PASSWORD ist gleich dem was bei cat /etc/psa/.psa.shadow` ausgegeben wird.

Gruß
Dirk


----------



## nillehammer (25. Apr 2012)

X3TitanCore hat gesagt.:
			
		

> backupPath ist der Pfad wo das Backup gespeichert werden soll, während ich mit der Konsole schon im Verzeichnis war. Die Datei wird auch an der richtigen Stelle erzeugt mit dem Inhalt aus dem ersten Post.


Das ist schon klar, aber in diesem Fall willst Du ja nicht, dass *mysqldump* die Datei erzeugt. Wenn ich Deinen Quellcode richtig interpretiere, willst Du mysqldump's Ausgaben in Deinem Java-Programm einlesen und von dort in eine Datei schreiben. Wozu übergibst Du den Pfad also an mysqldump?



			
				X3TitanCore hat gesagt.:
			
		

> Was mich wundert ist, dass in der Backupdatei was drin steht, aber nicht die kompletten Backupdaten. Von daher sollte der Pfad zu mysqldump passen. Es hatte ja auch schon mal funktioniert, nur jetzt nicht mehr.
> 
> Wenn ich raten müsste, würde ich auf die Größe der DB tippen. Weiss nur nicht wovon das abhängt.


Das stimmt natürlich. Habe jetzt nochmal über Deinen Code geschaut. Ich glaube, das

```
process.waitFor();
```
könnte eine Ursache sein. Du willst ja die Ausgabe von mysqldump direkt in Deinem Java-Programm weiterverarbeiten und nicht erst, wenn mysqldump fertig ist.

[EDIT]
Wenn ich das jetzt alles zusammen nehme, ergibt sich für mich folgendes Mögliches Verhalten Deines Anwendungskonstruktes:
- Du rufst mysqldump auf. Es funktioniert auch und schreibt den Dump in die Datei backupPath
- Du wartest in Deinem Java-Programm brav, bis es fertig ist.
- Du liest in Deinem Java-Programm danach die Ausgabe von mysqldumd ein. Diese beinhaltet aber nur eine Zusammenfassung des ausgeführten Kommandos.
- Diese Zusammenfassung schreibst Du dann in backupPath und überschreibst damit alles, was mysqldump da vorher reingeschrieben hat.
[/EDIT]


----------



## irgendjemand (26. Apr 2012)

das Process.waitFor() muss raus ... ansonsten hast du einen deadlock ... da du auf das ende von mysqldump wartest ... und dann erst die daten lesen willst ... dieses aber wiederum auf das lesen der daten wartet bevor es sich beendet ...


----------



## X3TitanCore (26. Apr 2012)

Hi!

Hat leider auch nichts genutzt. 
Hab auch vor den 
	
	
	
	





```
br.close()
```
 noch ein flush gesetzt. 
Gleiches Ergebnis.


----------

