Un 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
- mysqldump — A Database Backup Program
- How to use MySQL 5 Part 5: Backup Data (greatly simplified)
- MySQL Backup script
- MySQL: Backup e Restore
- The World of DOS – Creating Batch Files
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”