Indice dei contenuti
Se siete degli accaniti utilizzatori di MySQL o MariaDB probabilmente saprete già che le distribuzioni di questi due validissimi DBMS open-source includono mysqldump, un pratico strumento utilizzabile da riga di comando che può essere utilizzato per eseguire copie di backup (o "dump", come il suo nome suggerisce) di tutti i dati presenti nel Database. Tra le tante cose che rendono mysqldump uno strumento eccezionale, mi preme ricordare le seguenti:
- È completamente gratuito, quindi non richiede investimenti (a differenza di molti altri software di backup). Inoltre è già fornito con qualsiasi installazione di MySQL o MariaDB, il che è un indubbio vantaggio in tutti i casi in cui installare prodotti di terze parti può essere un problema.
- È incredibilmente veloce. Con un SSD decente, mysqldump è in grado di effettuare il backup di molti GB di dati in pochi secondi.
- È molto facile da utilizzare. Talmente facile che, come vedremo in questo articolo, è possibile effettuare un backup di uno o più database con una singola riga di comando, a patto che ovviamente l'utente sia dotato dei permessi necessari.
- Non è necessario arrestare il database, anche se è fortemente consigliabile bloccare gli aggiornamenti (UPDATE, DELETE, INSERT) prima di eseguire il backup per evitare potenziali perdite di dati (ne parleremo più avanti).
Come funziona
Lo strumento mysqldump funziona in modo estremamente semplice: una volta eseguito, recupera il database schema e/o i dati contenuti all'interno di tutti i database indicati ed effettua un "dump", ovvero una scrittura su disco, di tutte queste informazioni all'interno di un unico file SQL. Questo file, una volta generato, conterrà tutte le istruzioni SQL necessarie per ricostruire la base dati da zero: in altre parole, conterrà una serie di istruzioni CREATE TABLE (una per ogni tabella trovata nei vari database) seguite da una gran quantità di istruzioni INSERT, una per ogni record presente in ciascun database.
Backup di tutti i Database
Questa è la singola riga di comando che è possibile utilizzare per effettuare il dump di tutti i database contenuti all'interno dell'istanza MySQL o MariaDB utilizzando mysqldump:
1 |
mysqldump -u db_root_user -p -x -A > /bak/db_backup.sql |
Di seguito forniamo una breve spiegazione degli switch / parametri utilizzati:
- Il parametro -u serve a indicare l'account utente da utilizzare per accedere (effettuare la connessione) al server del database: ovviamente il valore db_root_user, qui utilizzato come esempio, dovrà essere sostituito con un utente avente permessi e autorizzazioni sufficienti per accedere in lettura all'istanza DB indicata: è ovviamente possibile usare l'utente root, qualora non sia stato disabilitato, ma non è ovviamente una scelta ottimale per ovvie implicazioni di sicurezza - specialmente se si prevede di utilizzare il comando all'interno di uno script da eseguire tramite scheduled task / operazioni pianificate (windows) o tramite cronjob (linux).
- Il parametro -p, utilizzato senza specificare esplicitamente la password, farà apparire la richiesta della password tramite prompt: in altre parole, il comando richiederà la digitazione manuale della password al momento di ciascuna esecuzione. Per evitare la necessità di dover inserire la password manualmente ogni volta è ovviamente possibile specificare una password (sostituendo -p con -p password_in_chiaro): questa modifica consentirà di automatizzare il comando mediante attività pianificate / cronjob, ma renderà l'intera operazione molto meno sicura - specie nel malaugurato e indesiderabile caso in cui venga utilizzata l'utenza root o una qualsiasi altra utenza con privilegi di scrittura e/o modifica degli archivi.
- Il parametro -x provoca il blocco di tutte le tabelle per tutta la durata del backup: tale blocco è effettuato dal server SQL stesso e sarà mantenuto fino al termine del processo: si tratta di una opzione estremamente utile se si vuole avere la certezza che i dati nei vari DB non subiscano modifiche mentre si sta effettuando il backup. Inutile dire che questa scelta provocherà anche un periodo di inattività per il Database, e quindi potenzialmente per tutti i servizi ad esso collegati: è quindi opportuno fare molta attenzione a utilizzarlo, specialmente se il database è collegato ai servizi di produzione!
- Il parametro -e indica al server di raggruppare le istruzioni INSERT per ciascuna tabella: questo causerà la riduzione dello spazio occupato dal file di dump e consentirà di eseguire più rapidamente eventuali ripristini futuri. Non va utilizzata se si ha necessità di tenere separati gli INSERT, ad esempio per eseguire il ripristino selettivo di alcuni record.
- Il parametro -A (notare la maiuscola) specifica che il dump deve essere effettuato per tutti i database.
- Ultimo, ma non meno importante, il segno > (maggiore di) indica al sistema di reindirizzare lo standard output (STDOUT) al percorso e al file indicato.
Alcuni di questi switch hanno una versione "estesa", che ha il vantaggio di renderli più comprensibili.
1 |
mysqldump -user=db_root_user --password --lock-tables -all-databases > /bak/db_backup.sql > /bak/db_backup.sql |
Come si può vedere, questa sintassi "estesa" rende le varie opzioni più comprensibili e può essere quindi consigliata all'interno di uno script. Ricordate che, nel caso in cui vogliate indicare la password in chiaro, la sintassi estesa richiede l'utilizzo del segno uguale (--password=your_password) al posto dello spazio richiesto dal parametro -p.
Backup di un singolo Database
E' ovviamente possibile utilizzare mysqldump anche per effettuare il backup di un singolo database (o di un insieme di database specifici):
1 |
mysqldump --user=db_root_user --password --lock-tables --databases db_name > /bak/db_backup.sql |
L'unica differenza rispetto alla sintassi utilizzata in precedenza è data dalla sostituzione del parametro --all-databases (-A) in favore del parametro --databases (-B), seguito dal nome del database del quale vogliamo effettuare il dump. Nel caso in cui si voglia effettuare il dump di due o più database, sarà sufficiente indicare i nomi di ciascuno, separandoli con un singolo spazio.
Backup di Tabelle
Quando si ha a che fare con database di grandi dimensioni è possibile che si abbia la necessità di voler eseguire il backup dei dati contenuti all'interno di singole tabelle, anziché all'intero database. Anche questa operazione può essere effettuata con una singola riga di comando:
1 |
mysqldump --user = db_root_user --password --lock-tables nome_db nome_tabella> /bak/db_backup.sql |
Come potete vedere, in questo caso i parametri --all-databases (-A) o --databases (-B) non vengono utilizzati: operando in questo modo mysqldump assumerà automaticamente che il primo nome indicato è il database e il secondo è una delle tabelle ivi contenute. Anche in questo caso, qualora volessimo eseguire il backup di più tabelle, sarà sufficiente elencarle dopo il nome del database, avendo cura di separarle con un singolo spazio.
Ripristino del backup
Al termine dell'istruzione mysqldump illustrata nei paragrafi precedenti avremo a disposizione un file db_backup.sql contenente il backup del nostro database.
Per ripristinarlo sarà sufficiente effettuare le seguenti operazioni:
- Copiare il file db_backup.sql dal server di origine al server di destinazione.
- Aprire un prompt dei comandi (o una finestra terminal) sul server di destinazione e digitare il seguente comando:
1 |
mysql -u NOME_UTENTE -p < db_backup.sql |
Nel caso in cui il backup contenga una pluralità di database e volessimo ripristinarne uno solo, il comando dovrà essere modificato aggiungendo l'opzione --one-database nel seguente modo:
1 |
mysql -u NOME_UTENTE -p --one-database NOME_DATABASE < db_backup.sql |
Inutile dire che, affinché i comandi di cui sopra funzionino, sul server di destinazione deve essere presente una istanza di MySQL server comprensivo di MySQL Command-Line interface (CLI).
Conclusioni
La nostra breve guida all'utilizzo di mysqldump è giunta al termine: siamo certi che, una volta che ci avrete preso la mano, sarete d'accordo anche voi nel considerarla una delle migliori opzioni che è possibile utilizzare per eseguire backup di database, tabelle e archivi DBMS. Nel caso in cui abbiate bisogno di ulteriori informazioni sui comandi e/o sui parametri da utilizzare, vi consigliamo di consultare la documentazione ufficiale di MySQL, valida anche per MariaDB. Gli amministratori che utilizzano Windows per operare sul database potranno inoltre trovare utile la nostra recensione di SQLyog, un ottimo strumento di gestione MySQL/MariaDB che mette a disposizione una pratica GUI al posto della command-line (DISCLAIMER: si tratta di una recensione del tutto spontanea e per la quale né il sito né gli autori hanno percepito alcunché).