Backup remoto di un database MySQL su FTP con lftp e gzip per Windows.

Se avete mai avuto la necessità di fare un semplice backup di un DB MySQL e avete cercato in rete una soluzione facile ed efficace avrete sicuramente notato la mole inaudita di soluzioni più o meno professionali e potenti (dal costosissimo MySQL Enterprise Backup all’altrettanto valido, migliore, open source e gratuito XtraBackup della Percona) ma sopratutto infiniti script più o meno elaborati che facendo uso del semplice mysqldump permettono un backup (magari in rete).
Solitamente però sono fatti scritti in shell scripting (bash, sh, csh) o in linguaggi tipo Perl o Python che fanno uso dei comandi di sistema per ovviare le operazioni elementari che un backup richiede.
Difficilmente (in verità mai, ecco perchè ho scritto questo articolo) si trovano script funzionanti in ambiente Windows che permettano un uso immediato, semplice e malleabile come su ambienti Linux.

Lo spunto di questo articolo nasce dunque da un caso reale, e più precisamente la necessità di effettuare un backup remoto di un DB MySQL di uno studio personal training per salvaguardare i dati da eventuali rotture hardware, perdite dati, furti.

Lo script fa uso di 2 comandi originariamente Linux ricompilati e portati su Windows.

  • gzip (per la compressione del DB)
  • lftp (per il trasferimento e la sincronizzazione del backup generato su un server FTP)

 

il tutto viene invocato da uno script batch (.bat) che esegue il dump del DB (che fa uso di tabelle innodb, stored procedure, funzioni, viste) tramite l’invocazione di mysqldump (dell’installazione mysql originale già presente sul sistema) con l’opzione –routines che permette di fare il dump non solo dello schema e dei dati ma anche delle stored procedure, funzioni, trigger che sono elementi vitali del DB stesso.

Piu specificamente ecco l’intero script:

@echo off
 
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
set dt=%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%_%hour%%time:~3,2%
cls
 
echo -------------------------------------------------------------------------
echo Backup del Database in corso.
echo.
echo Per favore non chiudere questa finestra e non usare il gestionale.
echo.
echo -------------------------------------------------------------------------
echo.
 
c:\xampp\mysql\bin\mysqldump -uNOMEUTENTE -pPASSWORD --opt --routines nomedatabase | gzip.exe > c:\backup\sql\nomedatabase-%dt%.sql.gz
echo Trasferimento del backup remoto in corso ...
 
c:\backup\lftp -f /backup/copiaremota.lftp

Lo script di per se è molto semplice e nel dettaglio si comporta nel seguente modo :

  1. Crea una variabile hour a cui è associata l’ora del sistema
  2. Crea una variabile dt a cui è associata la data e l’ora del sistema
  3. invoca mysqldump (dal percorso dove è installato mysql) specificando username e password e il nome del database da salvare, passando l’output tramite pipe a gzip.exe che genera un file di tipo .gz sotto la cartella c:\backup\sql
  4.  viene invocato lftp che ha come parametro copiaremota.lftp

 

copiaremota.lftp è il file contenente le direttive da “dare in pasto” a lftp.exe

set ftp:ssl-allow no
open -u nomeutenteftp,passwordftp ftp.hostremoto.it
mirror -R --only-newer --verbose /backup/sql /
quit

Basterà dunque modificare username e password e il nome dell’host remoto per il server ftp nel file copiaremota.lftp per adattarlo al proprio contesto.

Esso una volta processato da lftp.exe farà il mirror dei file nuovi dalla cartella c:\backup\sql alla root directory del server ftp in questo caso /

NOTA BENE : dato che lftp è conforme allo standard POSIX di unix, pur lavorando in ambiente windows, la cartella c:\backup\sql diverrà nel file di configurazione .lftp /backup/sql

Per far funzionare il tutto dunque, scompattare l’allegato che troverete alla fine di questo articolo in c:\backup, modificare il file backup.bat con il path corretto di mysqldump, nome utente e password mysql e nome del database.

Successivamente modificate il file copiaremota.lftp inserendo la configurazione corretta del vostro server ftp.

Lo script rimane dunque molto semplice e funzionale per il backup schedulato di DB MySQL di tipo MyISAM o InnoDB. Sicuramente non è la soluzione ideali per ambienti mission critical che richiedono l’integrità e la continuità in produzione su cui consiglio soluzioni di replica Master/Slave e backup a caldo con  XtraBackup, ma è una possibile soluzione per database di “semplici” gestionali.

In accoppiata con la schedulazione di Windows (ovvero Operazioni Pianificate) può diventare veramente di grossa utilità. In fondo basta solo lanciare backup.bat per avere una copia remota in maniera del tutto automatica.

Share and Enjoy:
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Digg
  • LinkedIn
  • oknotizie
  • MySpace
  • Technorati
  • Live
  • Slashdot

3 commenti su “Backup remoto di un database MySQL su FTP con lftp e gzip per Windows.”

  1. Thanks for posting this, it’s heplufl. I used it to update a couple of blogs that are running at 1and1. The unfortunate thing about the SQL backups and restores is that somehow all of the accented characters either get turned into unreadable characters or regular characters when the backup file gets imported through phpMyAdmin. I do wish that didn’t happen, as I’ve had to go through pages and posts manually to correct them. Thank goodness these weren’t big blogs, or I’d have had to find another way to upgrade the DB.

  2. Molto utile grazie davvero! 🙂
    Avrei una piccola domanda se possibile…
    mirror -R –only-newer –verbose /backup/sql /
    Questa riga copia i files sul srv remoto giusto?
    Ora io avrei bisogno che questi files trasferiti (nel mio caso semplici .txt) siano settati a 777 e non a 700 come avviene adesso.. in quanto altrimenti non sono leggibili da un’altra interfaccia flash che li deve visualizzare. E’ possibile settarli con questi permessi in automatico senza doverlo fare a mano tramite ftp program? Se si come? Grazie ancora comunque! Tom

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *