Categories
Database Backup

** Discover how DevOps engineers and DBAs can detect corrupted database backups before disaster strikes. Learn advanced techniques for PostgreSQL, SQL Server, and MySQL, including automated restore testing and checksum validation.

Nel mondo ad alto rischio dell’amministrazione di database e dell’ingegneria dell’affidabilità dei siti, esiste un assioma ben noto: il Backup di Schrödinger. La condizione di qualsiasi backup è sconosciuta finché non si tenta di ripristinarlo. Fino a quel momento, esiste in uno stato quantistico in cui è sia perfettamente valido che completamente corrotto.

Per gli ingegneri DevOps e i DBA, scoprire che un backup critico del database è corrotto durante un incidente attivo è lo scenario da incubo definitivo. Trasforma una routine di ripristino in un evento catastrofico di perdita di dati. Questo “killer silenzioso” dell’integrità dei dati passa spesso inosservato perché i processi di backup segnalano frequentemente un Exit Code 0 di successo anche quando il payload sottostante è compromesso.

In questa guida completa, analizzeremo l’anatomia della corruzione dei backup, esploreremo le tecniche di convalida specifiche per database e dimostreremo come costruire pipeline di ripristino automatizzate e a prova di bomba per gli ambienti di produzione.

L’anatomia della corruzione dei backup

Per rilevare la corruzione, devi prima capire come si verifica. La corruzione dei backup rientra generalmente in due categorie: fisica (a livello di infrastruttura) e logica (a livello di applicazione).

Corruzione fisica

La corruzione fisica si verifica quando i bit effettivi sul supporto di memorizzazione vengono alterati. Ciò può accadere durante il processo di lettura dal disco sorgente, durante il transito di rete o a riposo sullo storage di destinazione.
* Bit Rot: Il degrado graduale dei supporti di memorizzazione può invertire i bit silenziosamente.
* Errori di transito: Sebbene il protocollo TCP disponga di checksum, questi sono notoriamente deboli (16-bit). Gli ambienti ad alto throughput possono subire una corruzione silenziosa dei dati durante il transito che il TCP non riesce a rilevare.
* Guasti al controller di archiviazione: I bug hardware nei controller RAID o nelle fabric SAN possono scrivere dati spazzatura segnalando al contempo il successo al sistema operativo.

Corruzione logica

La corruzione logica è probabilmente più pericolosa perché il file di backup stesso è perfettamente intatto, ma i dati al suo interno sono danneggiati.
* Garbage In, Garbage Out (GIGO): Se il tuo database live ha un indice corrotto o una pagina danneggiata, il tuo strumento di backup potrebbe copiare fedelmente quella pagina corrotta. Il processo di backup ha successo, ma il ripristino fallirà o produrrà un database danneggiato.
* Transazioni incomplete: Gli snapshot a livello di file system eseguiti senza bloccare correttamente l’I/O del database (ad esempio, non utilizzando FLUSH TABLES WITH READ LOCK in MySQL) portano a pagine danneggiate e stati non recuperabili.

Rilevamento proattivo: Checksum e hashing crittografico

La prima linea di difesa contro la corruzione fisica è la convalida crittografica. Affidarsi alle dimensioni dei file o alle date di modifica è insufficiente.

Abilitazione dei checksum a livello di database

I moderni sistemi di gestione di database relazionali (RDBMS) supportano i checksum a livello di pagina. Quando abilitato, il database calcola un checksum per ogni pagina prima di scriverla su disco. Quando la pagina viene letta (da una query o da un processo di backup), il checksum viene verificato.

Per PostgreSQL, puoi abilitare i checksum dei dati durante l’inizializzazione del cluster:

# Inizializza un nuovo cluster PostgreSQL con checksum abilitati
initdb --data-checksums -D /var/lib/postgresql/data

Nota: se hai un cluster PostgreSQL esistente, puoi utilizzare l’utility pg_checksums per abilitarli offline.

Per Microsoft SQL Server, assicurati che PAGE_VERIFY sia impostato su CHECKSUM (l’impostazione predefinita nelle versioni moderne, ma vale la pena verificarlo sui sistemi legacy):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Convalida dei backup a riposo

Una volta che il backup arriva sulla destinazione di archiviazione, la sua integrità deve essere verificata crittograficamente. Le piattaforme di backup aziendali come CloudSave calcolano e verificano automaticamente gli hash SHA-256 dei blocchi di backup durante il transito e a riposo. Se stai gestendo script personalizzati, devi implementarlo manualmente:

# Genera l'hash SHA-256 dopo la creazione del backup
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Verifica l'hash sul server di archiviazione
sha256sum -c prod_db_backup.tar.gz.sha256

Tecniche di convalida specifiche per database

Diversi motori di database offrono strumenti nativi per verificare l’integrità dei loro artefatti di backup.

PostgreSQL: pg_verifybackup

Introdotto in PostgreSQL 13, pg_verifybackup è una svolta per i backup fisici eseguiti con pg_basebackup. Legge il file backup_manifest generato durante il backup e verifica che tutti i file siano presenti e che i loro checksum corrispondano.

# Esegui la verifica su una directory di backup fisico di base
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Se un singolo bit è stato invertito in uno qualsiasi dei file di dati, pg_verifybackup genererà un errore fatale, consentendo ai tuoi sistemi di monitoraggio di avvisare immediatamente il team DBA.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server fornisce un comando nativo per verificare l’integrità fisica di un file di backup senza ripristinarlo effettivamente. Controlla le intestazioni del backup e convalida i checksum delle pagine (se erano stati abilitati durante il backup).

RESTORE VERIFYONLY 
FROM DISK = 'Z:BackupsProdDB_Full.bak' 
WITH CHECKSUM;

Attenzione: RESTORE VERIFYONLY conferma solo che il file di backup è leggibile e che i checksum fisici corrispondono. Non garantisce l’integrità logica. Per garantire l’integrità logica, è necessario eseguire un ripristino completo ed eseguire DBCC CHECKDB.

MySQL / InnoDB: Percona XtraBackup

Per gli ambienti MySQL, i backup fisici sono spesso gestiti da Percona XtraBackup. Il processo di backup consiste nella copia dei file, ma il backup non è coerente finché non vengono applicati i log delle transazioni (redo logs). La fase --prepare funge da controllo di integrità integrato.

# La preparazione del backup applica i redo log. 
# Se il backup è corrotto, questo passaggio fallirà.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Il gold standard: Test di ripristino automatizzati

I checksum e i comandi di verifica sono necessari, ma non sufficienti. L’unico modo per dimostrare definitivamente che un backup è valido è ripristinarlo. Negli ambienti DevOps moderni, questo processo deve essere completamente automatizzato.

Trattando i backup come codice, puoi costruire una pipeline CI/CD per i ripristini del tuo database. Questa pipeline dovrebbe fornire un’infrastruttura effimera, eseguire il ripristino, eseguire query di convalida e distruggere l’ambiente.

Costruire una pipeline di ripristino automatizzata

Di seguito è riportato un esempio di script Bash che potrebbe essere attivato quotidianamente da un cron job o da un runner CI (come GitLab CI o GitHub Actions) per convalidare un dump logico di PostgreSQL.

#!/bin/bash
set -e

BACKUP_FILE="/mnt/storage/prod_db_latest.dump"
DB_NAME="prod_db"
CONTAINER_NAME="pg_restore_test"

echo "[INFO] Avvio del test di ripristino automatizzato..."

# 1. Avvia un container PostgreSQL effimero
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Attendi che PostgreSQL sia pronto
echo "[INFO] In attesa dell'inizializzazione del database..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Crea il database di destinazione
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Esegui il ripristino
echo "[INFO] Ripristino del backup in corso..."
docker cp $BACKUP_FILE $CONTAINER_NAME:/tmp/backup.dump
docker exec $CONTAINER_NAME pg_restore -U postgres -d $DB_NAME -1 /tmp/backup.dump

# 4. Esegui query di convalida logica
echo "[INFO] Esecuzione delle query di convalida..."
# Verifica se la tabella utenti ha più di 10.000 record
USER_COUNT=$(docker exec $CONTAINER_NAME psql -U postgres -d $DB_NAME -t -c "SELECT COUNT(*) FROM users;")

if [ "$USER_COUNT" -lt 10000 ]; then
    echo "[ERROR] Convalida logica fallita. Previsti >10000 utenti, trovati $USER_COUNT"
    # Attiva l'avviso PagerDuty / Slack qui
    exit 1
else
    echo "[SUCCESS] Convalida logica superata. Conteggio utenti: $USER_COUNT"
fi

# 5. Distruggi l'ambiente effimero
echo "[INFO] Pulizia in corso..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Test di ripristino automatizzato completato con successo."

Cosa dovresti convalidare?

Quando esegui test di ripristino automatizzati, non limitarti a verificare se il database si avvia. Esegui query di convalida specifiche per l’applicazione:
1. Conteggio righe: Assicurati che le tabelle principali abbiano il numero di righe previsto (ad esempio, la tabella users non dovrebbe essere vuota).
2. Dati recenti: Interroga i record creati nelle ultime 24 ore per assicurarti che il backup non sia obsoleto.
3. Integrità referenziale: Esegui script per verificare la presenza di chiavi esterne orfane, che indicano una corruzione logica.

Monitoraggio e avvisi per anomalie nei backup

Rilevare la corruzione prima che si verifichi un disastro richiede un’osservabilità solida. Oltre agli stati binari di successo/fallimento, dovresti monitorare i metadati dei tuoi processi di backup per rilevare anomalie.

Monitoraggio euristico

Integra i metadati del tuo backup in Prometheus e visualizzali con Grafana. Imposta avvisi per le seguenti euristiche:
* Cali improvvisi di dimensioni: Se il tuo backup giornaliero è costantemente di 500GB e il backup di oggi è di 50MB, il processo potrebbe essere stato completato con successo (Exit Code 0), ma probabilmente ha eseguito il backup di uno schema vuoto.
* Anomalie di durata: Se un backup che normalmente richiede 2 ore termina in 5 minuti, qualcosa è stato saltato. Al contrario, se richiede 10 ore, potresti avere un degrado dell’I/O del disco che potrebbe portare alla corruzione.
* Accumulo di WAL/Archive Log: Se il tuo database sta generando Write-Ahead Logs (WAL) ma il sistema di backup non li sta archiviando abbastanza velocemente, rischi un’interruzione nella tua catena di Point-in-Time Recovery (PITR).

Implementazione della regola 3-2-1 con controlli di integrità

La regola di backup 3-2-1 standard del settore (3 copie dei dati, 2 supporti diversi, 1 fuori sede) è efficace solo se tutte le copie vengono verificate.

È qui che l’utilizzo di una soluzione aziendale come CloudSave riduce drasticamente il carico operativo. Invece di scrivere e mantenere script bash complessi per ogni nodo di database, CloudSave si integra direttamente con la tua infrastruttura per automatizzare il ciclo di vita 3-2-1. Fornisce uno storage immutabile (proteggendo dai ransomware) e dispone di programmi di verifica del ripristino automatizzati e integrati. CloudSave può avviare automaticamente ambienti sandbox isolati, montare il backup, eseguire i tuoi script di convalida SQL personalizzati e riportare lo stato di salute alla tua dashboard centrale.

Conclusione

I backup del database corrotti sono un killer silenzioso che può distruggere le aziende. Affidarsi esclusivamente all’Exit Code 0 di uno script di backup è una scommessa pericolosa.

Per proteggere veramente i tuoi ambienti di produzione, devi adottare una strategia di difesa in profondità:
1. Abilita i checksum a livello di pagina all’interno del tuo motore di database.
2. Utilizza strumenti di verifica nativi (pg_verifybackup, RESTORE VERIFYONLY) immediatamente dopo la creazione del backup.
3. Monitora i metadati del backup (dimensioni, durata) per anomalie euristiche.
4. Implementa test di ripristino automatizzati ed effimeri come parte della tua pipeline operativa quotidiana.

Passando da una mentalità di backup passiva “imposta e dimentica” a un modello attivo di “convalida continua del ripristino”, ti assicuri che, quando il disastro colpirà inevitabilmente, i tuoi dati saranno pronti, affidabili e completamente recuperabili.