Kategorien
Administration Allgemein Batch (DOS) Das Netz Programmierung Windows

Backup von MySQL-DB und Webspace per Batch

Ein Backup des eigenen Webspace und der ggf. vorhandenen MySQL-Datenbank zu erstellen ist prinzipiell kein Problem.
Nachfolgend möchte ich aber eine Lösung (unter Windows) zeigen, die es ermöglicht diese Aufgabe schnell und unkompliziert für mehrere Hostings durchzuführen, das auf Wunsch auch zeitgesteuert.
Benötigt werden dafür folgende Komponenten:

  • mysqldump.exe
    Dieses Tool wird z.B. hier beschrieben.
    Eine Downloadmöglichkeit habe ich dort nicht finden können, weshalb ich mir die aktuelle Version aus dem XAMPP-Server gezogen habe.
  • Zip Commandline-Version

    Um die gesicherten Dateien zu archivieren, sollten diese am besten gepackt werden. Dafür habe ich die Commandline-Version von 7-Zip genutzt (7za.exe).

  • Einen Commandline-Tool wie z.B. WGet, da der Windowseigene FTP-Client keine Verzeichnisstruktur unterstützt.
    Benötigt werden hier die Pakete Binaries (wget.exe) und Dependencies (DLLs).
  • Eine selbst erstelltes Batch-Script (Beispiel unten).
  • Genügend lokaler Speicherplatz. 😉

Nachdem alle nötigen Dateien aus dem Netz gezogen sind sollten folgende Dateien im Verzeichnis liegen
7za.exe
libiconv2.dll
libintl3.dll
mysqldump.exe
wget.exe

Dann fehlt eigentlich nur noch ein Batch-Script, in dem die entsprechenden Aufrufe enthalten sind. Dieses legen wir auch in unser Vereichnis ab.
Hier ein Beispiel für ein solches Script, das die MySQL-Datenbank als SQL und als XML-File sowie den Webspace via FTP sichert. Zusätzlich wird noch eine lokale Webseitenkopie angelegt, die später auch lokal nutzbar ist (Nur als zusätzliches Backup nicht 100%ig!).
All diese Daten werden in jeweilige Unterverzeichnisse kopiert, dann zusammen in ein ZIP-File gepackt und dann wieder gelöscht.

@ECHO off

REM - Variablenzuweisung
set projektname=WiSch
set dbhost=datenbankhostserver.de
set dbname=DBName
set dbuser=DBUsername
set dbpw=DBPasswort
set ftpuser=FTPUsername
set ftppw=FTPPasswort
set ftpurl=ftp://domain.de/htdocs
set weburl=http://www.domain.de/

REM - Zeitstempel erstellen
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set ZEIT=%TIME%
set ZEIT=%ZEIT: =0%
set ZEIT=%ZEIT::=%
set ZEIT=%ZEIT:,=%
set stunde=%ZEIT:~-8,2%
set minute=%ZEIT:~-6,2%
set sekunde=%ZEIT:~-4,2%
set datum=%jahr%%monat%%tag%
set zeit=%stunde%%minute%%sekunde%
set timest=%datum%%zeit%

REM - Verzeichnis für den Datenbankinhalt erstellen
md database
REM - MySQL-Datenbank in lokales SQL sichern
mysqldump.exe --host=%dbhost% --user=%dbuser% --password=%dbpw% --default-character-set=utf8 --log-error=database/%projektname%_SQL-DB.log %dbname% >database/%projektname%_DB.sql
REM - MySQL-Datenbank in lokales XML sichern
mysqldump.exe --host=%dbhost% --user=%dbuser% --password=%dbpw% --default-character-set=utf8 --log-error=database/%projektname%_XML-DB.log --xml DB3498 >database/W%projektname%_DB.xml

REM - Verzeichnis fuer den Webspaceinhalt erstellen 
md webspace
REM - WGET-FTP nutzen um den Webspace komplett in das erstellte Unterverzeichnis zu sichern
wget --ftp-user=%ftpuser% --ftp-password=%ftppw% --recursive --level=20 --directory-prefix=./webspace --output-file=./webspace/%projektname%.log --server-response %ftpurl%

REM - Verzeichnis fuer die Webseitenkopie erstellen
md website
REM - WGET nutzen um eine lokale Kopie der Webseite zu erstellen (mit angepassten Links / Nur zur lokalen Info, nicht 100%ig!)
wget --recursive --level=10 --convert-links --directory-prefix=./website --output-file=./website/%projektname%.log %weburl%

REM - Geladene Dateien in eine ZIP-Datei packen und die ungepackten Daten wieder löschen
7za a %projektname%_%timest%.zip database website webspace

REM - Temporäre Verzeichnisse und Dateien löschen
rmdir /S /Q database
rmdir /S /Q website
rmdir /S /Q webspace

In diesem Script werden die oben beschriebenen Schritte durchlaufen, sodass man am am Ende eine kompakte ZIP-Datei mit einem kompletten Backup hat.
Was ggf. noch anzupassen wäre, ist die Verzeichnistiefe, bis zu der WGET die Daten holt, im Script unter --level= anzugeben.
Auch zu beachten wäre noch, das WGET eine evtl. vorhandene robots.txt beachtet, also dort „verbotene“ Pfade nicht mit in den Download einbezieht.
Nicht zuletzt muß der Hoster auch für die DB-Sicherung auch einen externen Zugriff auf den DB-Host zulassen. Einige (z.B. 1und1) tun das – für unseren Fall – leider nicht.

Abschließend bleibt nur der Hinweis, das wir natürlich keine Gewährleistung für obiges Script und die Datensicherung übernehmen!
Viel Erfolg beim Sichern entgegen der Devise „Wer sichert ist feige!“. 😉

Update 13.04.2011
Der FTP-Download mit WGet hat zwar funktioniert, eine Kontrolle der Downloaddaten hat aber gezeigt, das die PHP-Dateien nicht im Original sondern im HTML-Format, also dem compilierten Format heruntergeladen wurde. Das habe ich nicht korrigieren können.
Deshalb muß hier eine Alternative gefunden werden:

  • Download der Freeware ncftp
  • Entpacken der MSI-Datei (ist nicht als ZIP erhältlich) z.B. mit dem Universal Extractor. Natürlich ist eine Installation auch möglich.
  • Die entpackte/installierte Datei ncftpget.exe in unser Scriptverzeichnis kopieren.
  • Anstelle des wget-Aufrufs folgende Zeile verwenden:
    ncftpget -R -u %ftpuser% -p %ftppw% -d ftpdownload.log %ftpurl% ./webspace /%ftppfad%
    Dabei hat sich zum Script oben noch eine zusätzliche Variable %ftppfad% ergeben, die entsprechend im Script übergeben werden muß.

Damit sollte nun auch ein korrekter FTP-Download erfolgen und eine vernünftige Sicherung klappen…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.