Database - MariaDB - MySQL

Gestire e Automatizzare i Backup MariaDB e MySQL

Quando gestiamo un database, uno dei fattori importanti è saper gestire i dati in esso contenuti. In questa guida vedremo come esportare tabelle specifiche, intere basi dati e come creare un sistema di backup compresso e automatico. Queste operazioni possono essere utili anche per migrare basi dati da un server ad un altro o per duplicare un ambiente.

Note sulla compatibilità

Se si sta utilizzando MariaDB dalla versione 10.x in poi, quando vengono lanciati i comandi (ad esempio mysql o msqldump) viene visualizzato un messaggio “comando deprecato“. Questo, in quanto MariaDB, ha introdotto come utility predefinite mariadb e mariadb-dump.

Perché è importante? Anche se la sintassi è quasi identica, mariadb-dump è l’unico in grado di gestire correttamente le funzionalità avanzate di MariaDB, come le Invisible Columns o il motore Aria. In questa guida utilizzeremo i comandi di MariaDB, nel caso si stia utilizzando MySQL sostituire il comando corrispondente.

Esportazione e Importazione manuale

Iniziamo vedendo il comando per esportare l’intero database che faremo tramite l’utility mariadb-dump (mysqldump se si sta utilizzando MySQL)

mariadb-dump -u [utente] -p [nome_db] > backup_db.sql

Per database di grandi dimensioni che utilizzano InnoDB, aggiungi il flag –single-transaction per evitare il blocco delle tabelle durante l’operazione

mariadb-dump -u [utente] -p [nome_db] --single-transaction --quick > backup_db.sql

e possiamo anche aggiungere la compressione del file per risparmiare spazio su disco

mariadb-dump -u [utente] -p [nome_db] --single-transaction | gzip > backup_db.sql.gz

Come verificare se il database utilizza InnoDB? Colleghiamoci al database

mariadb -u root -p

ed eseguiamo la seguente query

SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'NomeDatabase';

il risultato sarà l’elenco delle tabelle presenti nel database con il relativo motore

+--------------------------------------+--------+
| table_name                           | engine |
+--------------------------------------+--------+
| Tabella001                           | InnoDB |
| Tabella002                           | InnoDB |
| Tabella003                           | InnoDB |
+--------------------------------------+--------+
3 rows in set (0.003 sec)

Se invece è necessario estrarre solo alcune tabelle (es. clienti e ordini), vanno semplicemente elencate dopo il nome del database

mariadb-dump -u [utente] -p [nome_db] clienti ordini > backup_tabelle.sql

Ora vediamo come importare i dati esportati. Per prima cosa va creato il database di destinazione qualora non esiste già

mariadb -u root -p

CREATE DATABASE [NomeNuovoDatabase];
EXIT;

e di seguito vediamo come importare i dati nei 3 casi di esportazione che abbiamo visto in precedenza.

Importazione dell’intero database

mariadb -u [utente] -p [nuovo_db] < backup_db.sql

Importazione dell’intero database compresso

gunzip < backup_db.sql.gz | mariadb -u [utente] -p [nome_db]

Importazione di tabelle specifiche

mariadb -u [utente] -p [nuovo_db] < backup_tabelle.sql

Automatizzare l’esportazione

Abbiamo fin qui visto come fare l’esportazione e l’importazione dei dati in modo manuale. Ora vediamo uno script Bash che esporta, comprime in tempo reale e gestisce la rotazione dei file con gli export per non esaurire lo spazio su disco. Creiamo un nuovo file

vi backup_db.sh

con il seguente contenuto

#!/bin/bash

# --- CONFIGURAZIONE ---
USER="tuo_utente"
PASSWORD="tua_password"
DATABASE="nome_tuo_db"
BACKUP_DIR="percorso_backup"
DATA=$(date +"%Y-%m-%d_%H%M")
GIORNI_CONSERVAZIONE=7

# Crea la cartella se non esiste
mkdir -p $BACKUP_DIR

# --- ESECUZIONE (Esportazione + Compressione) ---
echo "Inizio backup compresso per $DATABASE..."

# Il comando mariadb-dump viene passato direttamente a gzip
mariadb-dump -u $USER -p$PASSWORD $DATABASE --single-transaction --quick | gzip > $BACKUP_DIR/${DATABASE}_${DATA}.sql.gz

if [ $? -eq 0 ]; then
  echo "Backup creato: ${DATABASE}_${DATA}.sql.gz"
else
  echo "ERRORE durante il backup!"
  exit 1
fi

# Rimuove i file più vecchi di 7 giorni
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +$GIORNI_CONSERVAZIONE -delete
echo "Pulizia completata."

assegniamo al file i permessi di esecuzione

chmod +x backup_db.sh

e scheduliamo l’esecuzione con cron (crontab -e) tutte le notti alle 03:00

00 03 * * * /percorso/backup_db.sh >> /var/log/backup_db.log 2>&1

Qualche consiglio sulla sicurezza

  • Regola del 3-2-1: Non tenere i backup solo sul server di produzione. Usa tool come scp o rsync per inviare una copia del backup su un altro sistema o cloud storage esterno
  • Test di Ripristino: Un backup è utile solo se funziona. Sembra un’affermazione banale ma occorre periodicamente effettuare anche dei test di restore dei backup effettuati automaticamente per verificarne l’integrità
  • Evitare Password in chiaro: Invece di scrivere la password nello script, usa un file ~/.my.cnf nella tua home directory con permessi 600
[client]
user=tuo_utente
password=tua_password

Importante: assicurati che il file abbia permessi 600 (lettura e scrittura solo per il proprietario), altrimenti MariaDB potrebbe ignorarlo per motivi di sicurezza

chmod 600 ~/.my.cnf

ora lo script è più pulito e sicuro, poiché non contiene credenziali “in chiaro”

#!/bin/bash

# --- CONFIGURAZIONE ---
# Non serve specificare USER e PASSWORD qui, verranno letti da ~/.my.cnf
DATABASE="nome_tuo_db"
BACKUP_DIR="percorso_backup"
DATA=$(date +"%Y-%m-%d_%H%M")
GIORNI_CONSERVAZIONE=7

# Crea la cartella se non esiste
mkdir -p $BACKUP_DIR

# --- ESECUZIONE ---
echo "Inizio backup compresso per il database: $DATABASE..."

# mariadb-dump leggerà automaticamente le credenziali da ~/.my.cnf
mariadb-dump $DATABASE --single-transaction --quick | gzip > $BACKUP_DIR/${DATABASE}_${DATA}.sql.gz

# Verifica esito
if [ $? -eq 0 ]; then
  echo "Backup completato con successo: ${DATABASE}_${DATA}.sql.gz"
else
  echo "ERRORE durante il backup! Controlla ~/.my.cnf o i permessi del database."
  exit 1
fi

# Rimuove i file più vecchi di 7 giorni
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +$GIORNI_CONSERVAZIONE -delete
echo "Pulizia vecchi backup completata."

Conclusione: La prevenzione è la tua miglior strategia

In un ecosistema digitale dinamico con cui ci dobbiamo confrontare ogni giorno, l’efficienza nella gestione dei dati passa inevitabilmente per l’automazione e la sicurezza. Adottare i comandi nativi MariaDB, proteggere le credenziali con il file ~/.my.cnf e implementare script di backup compressi non sono solo accorgimenti tecnici, ma pilastri fondamentali per la continuità del tuo business o del tuo progetto personale.

Ricorda: il miglior backup è quello che non devi ricordarti di fare, ma che è pronto a salvarti quando meno te lo aspetti.