MySQL: un semplice script batch DOS per il backup

MySQL-logo.jpgUn aspetto importante nella distribuzione di web application per piccole e medie aziende è il backup degli archivi. Nel caso, piuttosto frequente per questo target, che il server MySQL sia locale (all’interno della LAN) è possibile utilizzare l’utility mysqldump.exe distribuita insieme al pacchetto MySQL. Questa piccola applicazione client fornisce un output direttamente in SQL oppure in altri formati standard come ad esempio CSV e XML. Nel caso in cui le tabelle del database siano esclusivamente di tipo MyISAM, si può anche prendere in considerazione l’utilizzo di un’altra utility fornita insieme a MySQL che si chiama mysqlhotcopy che è uno script in PERL decisamente più veloce, ma inadatto a database di tipo innoDB.

Ci sono tre modi di lanciare mysqldump:

mysqldump [options] dbname [tables]
mysqldump [options] --databases db_name1 [db_name2 db_name3]
mysqldump [options] --all-databases

Nel primo caso è possibile specificare quali tabelle di un database processare per il backup, nel secondo è possibile specificare un certo numero di database mentre nell’ultimo caso tutti i database presenti vengono processati per il backup.

I parametri opzionali sono numerosi, quello che mi sembra più utile è --opt che raggruppa insieme una serie di opzioni che sono utilizzate frequentemente:

  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset

Nella sezione “User comments” del manuale di MySQL on-line relativa a MySQLDump viene segnalato un interessante script per automatizzare la procedura di backup su macchine dotate di sistema operativo Windows scritta in puro batch script DOS. Questo script è davvero completo e oltre al backup di tutti i database implementa anche la compressione dei file generati e l’invio di una mail all’amministratore del RDBMS

Poiché in molti casi si rende necessario solo il backup di uno o due database e non è necessaria né la compressione né l’invio delle mail, ho semplificato lo script lasciando solo le sue funzioni fondamentali che sono:

  • Creazione dei file sql per ogni db presente nella lista con un prefisso che indica la data e l’ora del backup
  • Creazione di un unico file di log che indica la data e l’ora di inizio e di fine backup e l’elenco dei database processati

Ecco il codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@echo off
:: ---- SETTINGS ----------------------------------------
:: db user name
set dbuser=root
:: db user password
set dbpass=
:: db list (separate each db name with a blank space)
set dblist=magazzino p4a_products_catalogue
:: backup directory 
set bkupdir=C:\dbBackups\files
:: MySQL folder
set mysqldir=C:\wamp\mysql
:: -----------------------------------------------------
:: Do not edit here
for /f %%i in ('doff.exe yyyymmdd_hhmiss') do set fn=%%i
for /f %%i in ('doff.exe dd-mm-yyyy_hh:mi:ss') do set nicedate=%%i
echo MySQLDump start on %nicedate% >> log.txt
for %%f in (%dblist%) do (
echo backing up %%f ...
"%mysqldir%\bin\mysqldump" --user=%dbuser% --password=%dbpass% --databases %%f --opt 
--quote-names --allow-keywords --complete-insert > "%bkupdir%\%fn%_%%f.sql"
echo Done! 
echo backup of %%f done! >> log.txt
)
for /f %%i in ('doff.exe dd-mm-yyyy_hh:mi:ss') do set nicedate=%%i
echo MySQLDump finished on %nicedate% >> log.txt
echo -- >> log.txt
echo All Done!

L’utilizzo è semplicissimo, è sufficiente impostare nella sezione “settings” i parametri che indicano username e password per l’accesso al server MySQL, la lista dei nomi dei database da processare, il percorso della directory di backup e il percorso della directory di installazione di MySQL.
All’interno dello script viene richiamato un programmino (doff.exe) che serve a restituire la data e l’ora di sistema in un formato utilizzabile per generare il suffisso dei files generati.
Infine un’avvertenza: nel codice che ho riportato qui sopra sono stato obbligato a spezzare la linea che contiene il comando di lancio di mysqldump, chi volesse copiare ed incollare questo codice dovrà eliminare il ritorno carrello che spezza la riga! Per semplificare, potete scaricare direttamente lo script insieme all’albero di directory per il backup e all’utility “doff.exe” qui

Chi utilizza server Linux potrà facilmente convertire questo in uno script bash. Inoltre ho trovato (ma non testato…) uno script per linux che funziona in modo simile: Shell script to backup MySql database

Riferimenti ed approfondimenti


Maurizio ha scritto:

Eccellente, coniuga perfettamente semplicità praticità e sopratutto funzionalità . Voto mio 10.
Grazie 1000

Massimiliano ha scritto:

Grande Script.
Ho una domanda.

Se lancio lo script manualmente dalla Prompt dei comandi tutto funziona correttamemte.
Mentre se lo metto in operazioni pianificate di windows il nome del file di backup pianificato non contiene le info su data ed ora.
Ossia invece di chiamarsi
20090907_120000_bk.sql
si chiama
_bk.sql

Da quanto ne capisco non viene eseguito doff.exe
Qualche consiglio?

L’utente utilizzato per schedulare il bat è quello di administrator

Mario Spada (Autore) ha scritto:

Grazie Massimiliano! Il problema è che, lanciando lo script da una posizione differente dalla directory in cui risiede (come avviene nelle operazioni pianificate), il percorso di doff.exe non è corretto. Per risolvere basta anteporre il path completo a doff.exe. Quindi, se la directory dove risiede lo script + doff.exe è C:\dbBackups\:
riga 15 diventa:
for /f %%i in (‘C:\dbBackups\doff.exe yyyymmdd_hhmiss’) do set fn=%%i
riga 16 diventa:
for /f %%i in (‘C:\dbBackups\doff.exe dd-mm-yyyy_hh:mi:ss’) do set nicedate=%%i
e riga 24 diventa:
for /f %%i in (‘C:\dbBackups\doff.exe dd-mm-yyyy_hh:mi:ss’) do set nicedate=%%i
oppure (meglio) crea una variabile con il path nella sezione “SETTINGS”