Ripristino di un backup

Ripristina i database PostgreSQL IBM Bob da un backup per recuperare dalla perdita di dati, migrare ambienti o tornare a uno stato funzionante.

Usa questa procedura per ripristinare IBM Bob e i relativi database PostgreSQL dai file di backup. Il processo di ripristino include la validazione dell'integrità del backup, la preparazione dell'ambiente, la ricreazione del database di destinazione, il ripristino del contenuto del backup e la verifica dei dati ripristinati prima di riportare i servizi applicativi in servizio.

Attenzione:

Il ripristino di un database sostituisce il contenuto esistente del database con i dati del file di backup selezionato. I servizi applicativi devono essere fermati prima di iniziare, poiché le scritture attive nel database possono corrompere il processo di ripristino. Testa sempre le procedure di ripristino in un ambiente non di produzione prima di eseguire un recovery in produzione.

Prima di iniziare

Prima di ripristinare un database, verifica quanto segue:

Verifica l'integrità del backup

# Access backup PVC
oc run backup-verify -n <bob-instance-namespace> --image=busybox --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "backup-verify",
        "image": "busybox",
        "command": ["sh"],
        "stdin": true,
        "tty": true,
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

# Inside the pod:
cd /backups/bob-db
gunzip -t backup_bob_20260902_020000.sql.gz  # Test gzip integrity
cat backup_bob_20260902_020000.sql.gz.meta   # Check metadata

Conferma i dettagli del backup

  • Il timestamp del backup corrisponde al punto di ripristino atteso.
  • Il nome del database è corretto.
  • La dimensione del backup è ragionevole.
  • Il file di metadati esiste ed è leggibile.

Crea un backup pre-ripristino

Prima di ripristinare, esegui il backup dello stato attuale del database:

oc exec -n <bob-instance-namespace> bob-db-1 -- \
  pg_dump -U postgres bob | gzip > pre-restore-backup-$(date +%Y%m%d_%H%M%S).sql.gz

Procedura di ripristino

Ferma tutti i servizi applicativi IBM Bob per evitare scritture nel database durante il ripristino.

# Scale down Bob services
oc scale deployment bob-admin-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=0 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=0 -n <bob-instance-namespace>

# Verify pods are terminated
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

Crea un pod di ripristino temporaneo che abbia accesso sia al database PostgreSQL che alla posizione di archiviazione dei backup.

# Get PostgreSQL image
POSTGRES_IMAGE=$(oc get cluster bob-db -n <bob-instance-namespace> -o jsonpath='{.spec.imageName}')

# Create restore pod
oc run postgres-restore -n <bob-instance-namespace> --image=$POSTGRES_IMAGE --rm -it --restart=Never \
  --overrides='{
    "spec": {
      "containers": [{
        "name": "restore",
        "image": "'$POSTGRES_IMAGE'",
        "command": ["bash"],
        "stdin": true,
        "tty": true,
        "env": [
          {"name": "PGHOST", "value": "bob-db-rw"},
          {"name": "PGPORT", "value": "5432"},
          {"name": "PGUSER", "value": "postgres"},
          {"name": "PGPASSWORD", "valueFrom": {"secretKeyRef": {"name": "bob-db-app", "key": "password"}}}
        ],
        "volumeMounts": [{
          "name": "backup",
          "mountPath": "/backups"
        }]
      }],
      "volumes": [{
        "name": "backup",
        "persistentVolumeClaim": {
          "claimName": "bob-db-backup-pvc"
        }
      }]
    }
  }'

All'interno del pod di ripristino, verifica il file di backup e testa la connessione al database:

# List available backups
ls -lh /backups/bob-db/

# Verify backup file
BACKUP_FILE="/backups/bob-db/backup_bob_20260902_020000.sql.gz"
gunzip -t $BACKUP_FILE
echo "Backup file is valid"

# Check metadata
cat ${BACKUP_FILE}.meta

# Test database connection
psql -c "SELECT version();"

Per la maggior parte degli scenari di recovery, ripristina in un database vuoto per garantire che i dati obsoleti o in conflitto vengano rimossi.

Attenzione:

Questo passaggio rimuove definitivamente il contenuto attuale del database.

psql -c "DROP DATABASE IF EXISTS bob;"
psql -c "CREATE DATABASE bob;"

Ripristina il database caricando il contenuto del backup in PostgreSQL:

# Extract and restore backup
gunzip -c $BACKUP_FILE | psql -d bob

# This may take several minutes depending on backup size

Prima di riportare l'applicazione in servizio, verifica che il ripristino sia stato completato correttamente:

# Connect to restored database
psql -d bob

# Verify tables exist
\dt

# Check row counts for key tables
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM projects;
SELECT COUNT(*) FROM conversations;

# Verify recent data
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

# Exit psql
\q

Dopo che la validazione del database è completata con successo, riavvia i servizi IBM Bob e consenti loro di riconnettersi al database ripristinato. Monitora i log di avvio dell'applicazione per errori o errori di migrazione.

# Exit restore pod
exit

# Scale up Bob services
oc scale deployment bob-admin-service --replicas=1 -n <bob-instance-namespace>
oc scale deployment bob-api-service --replicas=3 -n <bob-instance-namespace>
oc scale deployment bob-ui-service --replicas=2 -n <bob-instance-namespace>

# Verify pods are running
oc get pods -n <bob-instance-namespace> -l app.kubernetes.io/name=bob

# Check application logs
oc logs -n <bob-instance-namespace> -l app.kubernetes.io/name=bob --tail=50

Completa una validazione end-to-end dell'applicazione prima di consentire agli utenti di riconnettersi:

# Test application endpoints
curl -k https://bob.example.com/health

# Verify user login works
# Verify data access works
# Verify key functionality works

Una validazione riuscita indica che il processo di ripristino è completato.

Best practice

  • Testa sempre prima in un ambiente non di produzione.
  • Crea un backup pre-ripristino dello stato attuale del database prima di iniziare.
  • Verifica l'integrità del backup prima di iniziare.
  • Pianifica i tempi di inattività e comunicalo agli utenti.
  • Documenta il processo di ripristino e i risultati.
  • Verifica l'integrità dei dati dopo il ripristino.
  • Monitora attentamente l'applicazione dopo il ripristino.

Problemi comuni di ripristino

ProblemaCausaSoluzione
Spazio insufficienteSpazio su disco insufficiente per l'operazione di ripristinoEspandi il PVC o libera spazio di storage prima del ripristino.
Timeout della connessioneProblemi di connettività di rete o di disponibilità del databaseVerifica la connettività del database e aumenta i valori di timeout se necessario.
Errori di autorizzazioneL'utente di ripristino non dispone dei privilegi di database richiestiConcedi le autorizzazioni necessarie all'utente di ripristino prima di eseguire l'operazione di ripristino.
Come valuti questo argomento?