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.