jannisneedssolution
Goto Top

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

Content-Key: 187221

Url: https://administrator.de/contentid/187221

Printed on: April 18, 2024 at 19:04 o'clock

Member: Skyemugen
Skyemugen Jun 29, 2012 updated at 07:05:21 (UTC)
Goto Top
Aloha,

man öffne die Konsole, gebe

set /?
und
IF /?
ein ...

Zahl steigern ... innerhalb der Batch oder bei jedem Aufruf oder ... oder ?

greetz André
Member: pieh-ejdsch
pieh-ejdsch Jun 29, 2012 at 13:06:40 (UTC)
Goto Top
moin,

Zitat von @Jannisneedssolution:
ein Datenbankbackupstool erstellen
ein Stuhl für eine Bank? face-wink

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
Member: Arano
Arano Jun 30, 2012 at 14:36:00 (UTC)
Goto Top
Schönes Wochenende zusammen face-smile

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
  1. Wert in Datei speichern
  2. Wert aus Datei in Variable einlesen
  3. Wert um eins erhöhen
Wie man nun die existent einer Datei überprüft über lasse ich mal dir ;) Aber wie man an die Kommandobeschreibung kommt, hat man dir ja schon verraten, s. IF /?

__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
Member: bastla
bastla Jun 30, 2012 updated at 22:54:13 (UTC)
Goto Top
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:
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"  
Die Lösch-Zeile ist durch das "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
Member: Jannisneedssolution
Jannisneedssolution Jul 05, 2012 at 11:08:21 (UTC)
Goto Top
Hallo Arano,

Dein Post hat mich stark weitergebracht. Habe das File nun geschriben mit Dumpfunktion, sowie nur-aktuellste-10-Backups und dazu noch mit einer Art Logfile.

Sollte jemand mal ähnliche Probleme haben --> hier die Batch mit kurzen Erklärungen:

set /p zahl=<Counter.txt
set /a zahl=(%zahl%+1)
echo %zahl% >Counter.txt
set /a bckpdel=(%zahl%-10)

echo ######################### >>w3dev.bat.txt
echo # Backup vom %date% # >>w3dev.bat.txt
echo ######################### >>w3dev.bat.txt
echo Zeit: %time% >>w3dev.bat.txt
echo Backupnummer: %zahl% >>w3dev.bat.txt
echo Name: %zahl%w3devbackup_%date%.sql >>w3dev.bat.txt
echo Backup Löschen Nr.: %bckpdel%w3devbackup_%date%.sql >>w3dev.bat.txt
echo verwendeter Befehl: "D:\WAMP\MySQL\MySQL_Server_5.5\bin\mysqldump.exe -u root -pJBruler17 --opt --databases w3dev >D:\Backup\%zahl%w3devbackup_%date%.sql" >>w3dev.bat.txt

echo Fehler: >>w3dev.bat.txt

D:\WAMP\MySQL\MySQL_Server_5.5\bin\mysqldump.exe -u root -p[Passwort] --opt --databases w3dev >D:\Backup\%zahl%w3devbackup_%date%.sql 2>> w3dev.bat.txt

IF EXIST D:\Backup\%bckpdel%w3devbackup_*.sql DEL D:\Backup\%bckpdel%w3devbackup_*.sql 2>> w3dev.bat.txt

echo --- >>w3dev.bat.txt

IF EXIST D:\Backup\%zahl%w3devbackup_*.sql echo Backupfile erstellt >>w3dev.bat.txt

Mithilfe der Zeile "echo Fehler:" und "echo ---" halte ich mittels 2>>logfile.txt gleich die Meldungen fest, sobald etwas nicht funktioniert.
Mit --opt --databases richte ich es so ein, dass nicht alle Tabellen einzeln sondern der Dump in einem einzigen File gespeichert werden.
Mit set /p kann ich den Wert aus einem File auslesen und mit set /a kann ich dem Wert einer Variabe hinter dem = Zahlen addieren, subtrahieren oder andere Operatoren verwenden.

Danke nochmals an alle die mir geholfen haben.

Grüsse

Jannis
Member: Arano
Arano Jul 05, 2012 at 13:54:02 (UTC)
Goto Top
Hi,

freut mich helfen zu können :D

ABER....
echo Backup Löschen Nr.: %bckpdel%w3devbackup_%date%.sql >>w3dev.bat.txt
Hm... %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  
__!! 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
Member: bastla
bastla Jul 05, 2012 at 14:20:21 (UTC)
Goto Top
Musst du nicht auch das Datum von vor 10 Tagen verwenden ? ;)
bzw vielleicht doch gleich ganz auf die Nummer verzichten? face-wink

Grüße
bastla
Member: Jannisneedssolution
Jannisneedssolution Jul 05, 2012 at 14:26:25 (UTC)
Goto Top
Danke ;)
Das mit dem echo Backup Löschen Nr. ist noch falsch. Hier sollte ur die Nummer stehen

Das Passwort spielt keine Rolle da die Site nie online gehen wird sondern später neu auf einem Prod-Webserver mit anderen PWs innerhalb der Firmenumgebung mittels einer DNS-Umleitung laufen wird. Zudem ist es bloss das Entwicklerpasswort welches ich aktuell auf dem Dev-Webserver gesetzt habe face-smile

Aber du hast schon recht, den Befehl nochmals ins Log zu schreiben macht keinen Sinn da Befehlsänderungen sowieso dokumentiert sind.

Grüsse

Jannis