Backup mit Batchfile
Hey Leute,
ich möchte mit einem Batchfile ein Datenbankbackupstool erstellen, dass dann mittels Scheduled Tasks regelmässig Backups der Datenbank macht.
Grundsätzlich habe ich es mal so aufgebaut, wie es unten zu sehen ist doch ich kenne die Einzelheiten viel zu wenig:
Zahl = (Zahl + 1)
cd D:\WAMP\MySQL\MySQL_Server_5.5\bin
D:\WAMP\MySQL\MySQL_Server_5.5\bin\mysql.exe -u root -p
Passwort
mysqldump --tab=D:\Backup --opt %Zahl%backup_w3dev_%date%.sql
cd D:\Backup
If Zahl < (Zahl - 10) rm %Zahl%backup_w3dev_*.sql
Probleme:
- Ich weiss nicht wie ich die Variable Zahl einlesen und so kontinuierlich steigern kann
- Ich weiss nicht ob die Eingabe desPassworts so funkionieren kann
- Ich weiss nicht ob der IF Befehl so korrekt ist
Wäre euch dankbar wenn ihr mir weiterhelfen könntet. Natürlich wären auch andere Lösungsvorschläge toll.
Gruss Jannis
ich möchte mit einem Batchfile ein Datenbankbackupstool erstellen, dass dann mittels Scheduled Tasks regelmässig Backups der Datenbank macht.
Grundsätzlich habe ich es mal so aufgebaut, wie es unten zu sehen ist doch ich kenne die Einzelheiten viel zu wenig:
Zahl = (Zahl + 1)
cd D:\WAMP\MySQL\MySQL_Server_5.5\bin
D:\WAMP\MySQL\MySQL_Server_5.5\bin\mysql.exe -u root -p
Passwort
mysqldump --tab=D:\Backup --opt %Zahl%backup_w3dev_%date%.sql
cd D:\Backup
If Zahl < (Zahl - 10) rm %Zahl%backup_w3dev_*.sql
Probleme:
- Ich weiss nicht wie ich die Variable Zahl einlesen und so kontinuierlich steigern kann
- Ich weiss nicht ob die Eingabe desPassworts so funkionieren kann
- Ich weiss nicht ob der IF Befehl so korrekt ist
Wäre euch dankbar wenn ihr mir weiterhelfen könntet. Natürlich wären auch andere Lösungsvorschläge toll.
Gruss Jannis
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187221
Url: https://administrator.de/forum/backup-mit-batchfile-187221.html
Ausgedruckt am: 03.04.2025 um 01:04 Uhr
8 Kommentare
Neuester Kommentar
moin,
ein Stuhl für eine Bank?
Was genau hast Du denn Eigentlich vor?
Sollen immer nur die letzten 10 aktuellsten Sicherungen aufbewahrt werden?
Wenn die Befehle in der CMD-Line funktionieren (sollten?), dann gehen die auch in einem Batch.
Das gilt auch für die Passworteingabe.
Die Variable Date so wie sie in der CMD zur Verfügung gestellt wird, ist für Datumstempel nicht Gebräuchlich.
Wenn dann Umformatiert.
Gruß Phil
ein Stuhl für eine Bank?
Was genau hast Du denn Eigentlich vor?
Sollen immer nur die letzten 10 aktuellsten Sicherungen aufbewahrt werden?
Wenn die Befehle in der CMD-Line funktionieren (sollten?), dann gehen die auch in einem Batch.
Das gilt auch für die Passworteingabe.
Die Variable Date so wie sie in der CMD zur Verfügung gestellt wird, ist für Datumstempel nicht Gebräuchlich.
Wenn dann Umformatiert.
Gruß Phil
Schönes Wochenende zusammen 
Dann wollen wir das Niveau mal wieder etwas anheben
__Mitzählen:__
Durch das einfache ablegen des Wertes in einer Variablen wird der Wert mit dem Ende des Scripts auch aus dem Speicher gelöscht und ist somit verloren.
Nun könnten wir bei jedem starten der Batch-Datei die Anzahl der Dateien in dem Backupverzeichnis zählen um so den Wert wieder in Erfahrung zu bringen. Dies kann aber kompliziert werden wenn auch andere Backups oder das Backupscript selber ebenfalls in dem Verzeichnis liegen.
Also speichern wir den Wert einfach in einer separaten Datei. So brauchen wir beim starten der Batch nur überprüfen ob die Datei existiert ( = Wert auslesen) oder ob sie noch fehlt ( = null verwenden [erster Batch Aufruf oder ein "Reset"])
__Passwortübergabe:__
Nein, das funktioniert so NICHT !
Die Batch wird zeilenweise abgearbeitet (Stapelverarbeitung ;) ) - ein Kommando NACH dem anderem.
Das zweite Kommando wird also erst NACH DEM BEENDEN des ersten ausgeführt.
Nach dem ausführen von mysql.exe WARTET dieses Programm auf eine Eingabe (Passwort) und wartet und wartet und wartet...
In der Batch hängen wir also nun "zwischen den Zeilen".
Und selbst wenn dir weiter kämen, aus Sicht der Batch gibt es das Kommando "PASSWORT" auch NICHT was zu einer Fehlermeldung führen würde !
Also müssen wir das Passwort als Parameter mit dem Aufruf der "mysql.exe" als Parameter übergeben.
Das vermeintlich fehlende Leerzeichen zwischen "-p" und "PASSWORT" ist beabsichtigt ! Denn sonst würde mit "-p" nach einem Passwort gefragt werden und "PASSWORT" als der Name der zu verwendenden Datenbank angesehen werden ;)
__Datenbankbackup__
Hier hast du dich ordentlich verdacht :P
Wie eben schon beschrieben, kommst du erst in die nächste Zeile wenn das Kommando in der vorherigen beendet ist/wurde.
Über die "mysql.exe" loggst du dich allerdings über einen MySQL-Client in die Datenbank ein und erst nach dem Ausloggen geht es dann auch in der Batch weiter.
Jetzt kann man glaube ich die auszuführenden MySQL-Statements auch als Parameter oder in einer Datei an den MySQL-Client übergeben der diese dann ausführt. Das ist in deinem Fall aber weder nötig, noch möglich !
"mysqldump" ist kein Statement sondern ein eigenes Programm.
Also anstelle von "mysql.exe" rufst du einfach nur die "mysqldump.exe" auf und gibt diesem Programm sowohl den Usernamen und das Passwort mit.
Mehr dazu wie immer in der Doku MySQL Reference Manual - mysqldump
__Richtiges IF__
Die Beschreibung kennst du ja jetzt.
Allerdings hast du auch hier einen kleinen Denkfehler, mit
wird das AKTUELLE Backup gelöscht !!!
Hier musst du erst %zahl% um 10 reduzieren (s. mein Beispiel vom Mitzählen),
prüfen ob die Datei existiert und
erst dann löschen (wenn sie denn existiert)
den beim zweitem Backup würde versucht werden das Backup "-8" zu löschen (2-10 = -8)
So jetzt habe ich viel geschrieben und du einiges zum lesen und tippen ;)
Melde dich mal zurück wenn geklappt hat oder du doch noch irgendwo hängst.
Aber beachte dann mal ruhig die Formatierungshilfen des Forums, roter Link über dem Eingabefeld
Schönes Wochenende noch
~Arano
Dann wollen wir das Niveau mal wieder etwas anheben
__Mitzählen:__
Durch das einfache ablegen des Wertes in einer Variablen wird der Wert mit dem Ende des Scripts auch aus dem Speicher gelöscht und ist somit verloren.
Nun könnten wir bei jedem starten der Batch-Datei die Anzahl der Dateien in dem Backupverzeichnis zählen um so den Wert wieder in Erfahrung zu bringen. Dies kann aber kompliziert werden wenn auch andere Backups oder das Backupscript selber ebenfalls in dem Verzeichnis liegen.
Also speichern wir den Wert einfach in einer separaten Datei. So brauchen wir beim starten der Batch nur überprüfen ob die Datei existiert ( = Wert auslesen) oder ob sie noch fehlt ( = null verwenden [erster Batch Aufruf oder ein "Reset"])
set zahl=4
>"backupCounter.dat" echo %zahl%
<"backupCounter.dat" set /p zahl=
set /a neueZahl=%zahl%+1
- Wert in Datei speichern
- Wert aus Datei in Variable einlesen
- Wert um eins erhöhen
__Passwortübergabe:__
Nein, das funktioniert so NICHT !
Die Batch wird zeilenweise abgearbeitet (Stapelverarbeitung ;) ) - ein Kommando NACH dem anderem.
Das zweite Kommando wird also erst NACH DEM BEENDEN des ersten ausgeführt.
Nach dem ausführen von mysql.exe WARTET dieses Programm auf eine Eingabe (Passwort) und wartet und wartet und wartet...
In der Batch hängen wir also nun "zwischen den Zeilen".
Und selbst wenn dir weiter kämen, aus Sicht der Batch gibt es das Kommando "PASSWORT" auch NICHT was zu einer Fehlermeldung führen würde !
Also müssen wir das Passwort als Parameter mit dem Aufruf der "mysql.exe" als Parameter übergeben.
mysql -u USER -pPASSWORT
Das vermeintlich fehlende Leerzeichen zwischen "-p" und "PASSWORT" ist beabsichtigt ! Denn sonst würde mit "-p" nach einem Passwort gefragt werden und "PASSWORT" als der Name der zu verwendenden Datenbank angesehen werden ;)
__Datenbankbackup__
Hier hast du dich ordentlich verdacht :P
Wie eben schon beschrieben, kommst du erst in die nächste Zeile wenn das Kommando in der vorherigen beendet ist/wurde.
Über die "mysql.exe" loggst du dich allerdings über einen MySQL-Client in die Datenbank ein und erst nach dem Ausloggen geht es dann auch in der Batch weiter.
Jetzt kann man glaube ich die auszuführenden MySQL-Statements auch als Parameter oder in einer Datei an den MySQL-Client übergeben der diese dann ausführt. Das ist in deinem Fall aber weder nötig, noch möglich !
"mysqldump" ist kein Statement sondern ein eigenes Programm.
Also anstelle von "mysql.exe" rufst du einfach nur die "mysqldump.exe" auf und gibt diesem Programm sowohl den Usernamen und das Passwort mit.
mysqldump.exe -u USERNAME -pPASSWORT
Mehr dazu wie immer in der Doku MySQL Reference Manual - mysqldump
__Richtiges IF__
Die Beschreibung kennst du ja jetzt.
Allerdings hast du auch hier einen kleinen Denkfehler, mit
rm %Zahl%backup_w3dev_*.sql
wird das AKTUELLE Backup gelöscht !!!
Hier musst du erst %zahl% um 10 reduzieren (s. mein Beispiel vom Mitzählen),
prüfen ob die Datei existiert und
erst dann löschen (wenn sie denn existiert)
den beim zweitem Backup würde versucht werden das Backup "-8" zu löschen (2-10 = -8)
So jetzt habe ich viel geschrieben und du einiges zum lesen und tippen ;)
Melde dich mal zurück wenn geklappt hat oder du doch noch irgendwo hängst.
Aber beachte dann mal ruhig die Formatierungshilfen des Forums, roter Link über dem Eingabefeld
Schönes Wochenende noch
~Arano
Hallo @all und und willkommen im Forum Jannisneedssolution!
Nachdem Arano schon eine Menge Hinweise geliefert hast, nur noch eine Anmerkung zum Thema "nur 10 Backups behalten": Das Kunststück mit der laufenden Nummer ist eigentlich unnötig, wenn Du einfach das Sicherungsdatum passend formatiert in den Dateinamen integrierst und nach dem Ausführen des Backups nur noch die 10 aktuellsten Dateien behältst - etwa so:
Die Lösch-Zeile ist durch das "
Anstelle der Sortierung nach dem Dateinamen mit "
Grüße
bastla
Nachdem Arano schon eine Menge Hinweise geliefert hast, nur noch eine Anmerkung zum Thema "nur 10 Backups behalten": Das Kunststück mit der laufenden Nummer ist eigentlich unnötig, wenn Du einfach das Sicherungsdatum passend formatiert in den Dateinamen integrierst und nach dem Ausführen des Backups nur noch die 10 aktuellsten Dateien behältst - etwa so:
set "Datei=%date:~-4%%date:~-7,2%%date:~-10,2%_backup_w3dev.sql"
...
for /f "skip=10 delims=" %%i in ('dir /b/a-d/o-n D:\Backup\*_backup_w3dev.sql') do echo del "D:\Backup\%%i"
echo
" im "Demo-Modus" - die Löschbefehle werden so (zum Testen) nur angezeigt - wenn das Ergebnis vernünftig aussieht, einfach das "echo
" entfernen ...Anstelle der Sortierung nach dem Dateinamen mit "
/o-n
" (wegen des Datums in Schreibweise JJJJMMTT im Namen werden die 10 jüngsten Dateien übersprungen und nur alle weiteren noch vorhandenen "*_backup_w3dev.sql"-Dateien gelöscht) kann auch nach dem Änderungsdatum sortiert werden - dann "/o-d
" verwenden ...Grüße
bastla
Hi,
freut mich helfen zu können :D
ABER....
Hm...
Musst du nicht auch das Datum von vor 10 Tagen verwenden ? ;)
__!! Die GANZE WELT kennt nun dein Passwort !!__
Außerdem kannst du es im Logfile ruhig weglassen... nein, lasse es dort besser weg - wozu dutzende male hineinschreiben ?
Ebenso der Aufruf, der steht doch eh in der Batch-Datei ;)
Hinter dem spitzen Klammern fürs umleiten in eine Datei sollte besser kein Leerzeichen stehen ! (s. Löschen von alter Backupdatei)
Und wenn du das soweit alles hast, markiere diesen Beitrag doch bitte als gelöst !
~Arano
freut mich helfen zu können :D
ABER....
echo Backup Löschen Nr.: %bckpdel%w3devbackup_%date%.sql >>w3dev.bat.txt
%date%
ist das __heutige Datum__,%bckpdel%
aber die Nummer von __vor 10 Tagen__Musst du nicht auch das Datum von vor 10 Tagen verwenden ? ;)
echo verwendeter Befehl: "D:\WAMP\MySQL\MySQL_Server_5.5\bin\mysqldump.exe -u root -p"HIER_STEHT_DEIN_PASSWORT" --opt --databases w3dev >D:\Backup\%zahl%w3devbackup_%date%.sql" >>w3dev.bat.txt
Außerdem kannst du es im Logfile ruhig weglassen... nein, lasse es dort besser weg - wozu dutzende male hineinschreiben ?
Ebenso der Aufruf, der steht doch eh in der Batch-Datei ;)
Hinter dem spitzen Klammern fürs umleiten in eine Datei sollte besser kein Leerzeichen stehen ! (s. Löschen von alter Backupdatei)
Und wenn du das soweit alles hast, markiere diesen Beitrag doch bitte als gelöst !
~Arano