Un dump è un file di testo con istruzioni SQL. Che si ripristini o no dipende da come è stato scritto, e i valori predefiniti non sono quelli giusti per un sito in produzione. Quasi tutti i fallimenti in importazione si decidono settimane prima, nel momento in cui si prende il dump.
Il comando
mysqldump \
--single-transaction \
--quick \
--routines --triggers --events \
--default-character-set=utf8mb4 \
--set-gtid-purged=OFF \
dbname | gzip > db-$(date +\%F).sql.gz
Cosa impedisce ciascuna
- --single-transaction — un'istantanea coerente senza bloccare le tabelle. Senza, un sito trafficato resta congelato per tutta la durata del dump.
- --quick — scorre riga per riga invece di caricare in memoria una tabella grande.
- --routines --triggers --events — non sono comprese per impostazione predefinita. Un ripristino senza di esse sembra completo e perde in silenzio ogni procedura memorizzata e ogni evento pianificato.
- --default-character-set=utf8mb4 — l'arabo e le emoji sopravvivono al viaggio di andata e ritorno.
--single-transaction è coerente solo per InnoDB. Una tabella MyISAM nello stesso database viene copiata senza quella garanzia: convertile, oppure accetta una copia incoerente di quelle tabelle.
Verifica il file, non il codice di uscita
gzip -t db-2026-09-05.sql.gz # the archive is intact
zcat db-2026-09-05.sql.gz | tail -5 # ends with "Dump completed"
zcat db-2026-09-05.sql.gz | grep -c "CREATE TABLE"
Un dump troncato da un disco che si riempie resta un gzip valido per quasi tutta la sua lunghezza. La riga di chiusura in fondo è la prova che mysqldump è arrivato alla fine — e verificarla costa un comando.
Ripristinalo altrove, con regolarità
mysql -e "CREATE DATABASE restore_test CHARACTER SET utf8mb4"
zcat db-2026-09-05.sql.gz | mysql restore_test
mysql restore_test -e "SELECT COUNT(*) FROM orders"
Confronta quel conteggio di righe con la produzione. Un dump che si importa senza errori e arriva con metà delle righe è il guasto che nessuno intercetta, perché l'importazione non ha detto proprio nulla.
