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.

I den høye innsatsens verden innen databaseadministrasjon og driftssikkerhet (SRE), finnes det et velkjent aksiom: Schrödingers sikkerhetskopi. Tilstanden til enhver sikkerhetskopi er ukjent helt til du forsøker å gjenopprette den. Frem til det øyeblikket eksisterer den i en kvantetilstand der den er både perfekt brukbar og fullstendig korrupt.

For DevOps-ingeniører og databaseadministratorer (DBA-er) er det å oppdage at en kritisk databasesikkerhetskopi er korrupt under en aktiv hendelse, det ultimate marerittscenarioet. Det forvandler en rutinemessig gjenopprettingsoperasjon til en katastrofal hendelse med tap av data. Denne «stille morderen» av dataintegritet forblir ofte uoppdaget fordi sikkerhetskopieringsjobber ofte rapporterer en vellykket Exit Code 0 selv når den underliggende nyttelasten er kompromittert.

I denne omfattende guiden vil vi dissekere anatomien til korrupsjon i sikkerhetskopier, utforske databasespesifikke valideringsteknikker og demonstrere hvordan man bygger automatiserte, skuddsikre gjenopprettingsrørledninger for produksjonsmiljøer.

Anatomien til korrupsjon i sikkerhetskopier

For å oppdage korrupsjon må du først forstå hvordan den oppstår. Korrupsjon i sikkerhetskopier faller generelt inn i to kategorier: fysisk (infrastrukturnivå) og logisk (applikasjonsnivå).

Fysisk korrupsjon

Fysisk korrupsjon oppstår når de faktiske bitene på lagringsmediet blir endret. Dette kan skje under leseprosessen fra kildedisken, under nettverkstransport eller mens dataene ligger lagret på mållagringen.
* Bit-råte (Bit Rot): Gradvis forringelse av lagringsmedier kan snu biter lydløst.
* Transportfeil: Selv om TCP har kontrollsummer, er de notorisk svake (16-bit). Miljøer med høy gjennomstrømming kan oppleve stille datakorrupsjon over linjen som TCP ikke klarer å fange opp.
* Feil på lagringskontroller: Maskinvarefeil i RAID-kontrollere eller SAN-strukturer kan skrive søppeldata samtidig som de rapporterer suksess til operativsystemet.

Logisk korrupsjon

Logisk korrupsjon er uten tvil farligere fordi selve sikkerhetskopifilen er helt intakt, men dataene inni den er ødelagte.
* Søppel inn, søppel ut (GIGO): Hvis den aktive databasen din har en korrupt indeks eller en ødelagt side, kan sikkerhetskopieringsverktøyet ditt trofast kopiere den korrupte siden. Sikkerhetskopieringsjobben lykkes, men gjenopprettingen vil feile eller resultere i en ødelagt database.
* Ufullstendige transaksjoner: Øyeblikksbilder (snapshots) på filsystemnivå tatt uten å fryse database-I/O på riktig måte (f.eks. ved å ikke bruke FLUSH TABLES WITH READ LOCK i MySQL) resulterer i ødelagte sider og tilstander som ikke kan gjenopprettes.

Proaktiv deteksjon: Kontrollsummer og kryptografisk hashing

Den første forsvarslinjen mot fysisk korrupsjon er kryptografisk validering. Å stole på filstørrelser eller endringsdatoer er utilstrekkelig.

Aktivering av kontrollsummer på databasenivå

Moderne relasjonsdatabasesystemer (RDBMS) støtter kontrollsummer på sidenivå. Når dette er aktivert, beregner databasen en kontrollsum for hver side før den skrives til disk. Når siden leses (enten av et spørring eller en sikkerhetskopieringsprosess), verifiseres kontrollsummen.

For PostgreSQL kan du aktivere datakontrollsummer under klyngeinitialisering:

# Initialiser en ny PostgreSQL-klynge med kontrollsummer aktivert
initdb --data-checksums -D /var/lib/postgresql/data

Merk: Hvis du har en eksisterende PostgreSQL-klynge, kan du bruke pg_checksums-verktøyet for å aktivere dem offline.

For Microsoft SQL Server, sørg for at PAGE_VERIFY er satt til CHECKSUM (standard i moderne versjoner, men verdt å sjekke på eldre systemer):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Validering av sikkerhetskopier ved lagring

Når sikkerhetskopien lander på lagringsmålet ditt, må integriteten verifiseres kryptografisk. Bedriftsplattformer for sikkerhetskopiering som CloudSave beregner og verifiserer automatisk SHA-256-hasher av sikkerhetskopiblokker under transport og ved lagring. Hvis du administrerer egne skript, må du implementere dette manuelt:

# Generer SHA-256-hash etter opprettelse av sikkerhetskopi
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Verifiser hashen på lagringsserveren
sha256sum -c prod_db_backup.tar.gz.sha256

Databasespesifikke valideringsteknikker

Ulike databasedrivere tilbyr innebygde verktøy for å verifisere integriteten til sikkerhetskopiene sine.

PostgreSQL: pg_verifybackup

Introdusert i PostgreSQL 13, er pg_verifybackup en spillveksler for fysiske sikkerhetskopier tatt med pg_basebackup. Den leser backup_manifest-filen som genereres under sikkerhetskopieringen og verifiserer at alle filer er til stede og at kontrollsummene deres stemmer.

# Kjør verifisering mot en fysisk base-sikkerhetskopikatalog
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Hvis en eneste bit har endret seg i noen av datafilene, vil pg_verifybackup kaste en fatal feil, noe som gjør at overvåkingssystemene dine kan varsle DBA-teamet umiddelbart.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server tilbyr en innebygd kommando for å verifisere den fysiske integriteten til en sikkerhetskopifil uten å faktisk gjenopprette den. Den sjekker sikkerhetskopihodene og validerer sidekontrollsummene (hvis de var aktivert under sikkerhetskopieringen).

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

Advarsel: RESTORE VERIFYONLY bekrefter bare at sikkerhetskopifilen er lesbar og at fysiske kontrollsummer stemmer. Den garanterer ikke logisk integritet. For å sikre logisk integritet må du utføre en fullstendig gjenoppretting og kjøre DBCC CHECKDB.

MySQL / InnoDB: Percona XtraBackup

For MySQL-miljøer håndteres fysiske sikkerhetskopier ofte av Percona XtraBackup. Sikkerhetskopieringsprosessen består av å kopiere filer, men sikkerhetskopien er ikke konsistent før transaksjonsloggene (redo logs) er brukt. --prepare-fasen fungerer som en innebygd integritetssjekk.

# Klargjøring av sikkerhetskopien bruker redo-loggene. 
# Hvis sikkerhetskopien er korrupt, vil dette trinnet feile.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Gullstandarden: Automatisert gjenopprettingstesting

Kontrollsummer og verifiseringskommandoer er nødvendige, men de er ikke tilstrekkelige. Den eneste måten å definitivt bevise at en sikkerhetskopi er brukbar, er å gjenopprette den. I moderne DevOps-miljøer må denne prosessen være fullstendig automatisert.

Ved å behandle sikkerhetskopier som kode, kan du bygge en CI/CD-rørledning for databaseregenerering. Denne rørledningen bør klargjøre midlertidig infrastruktur, utføre gjenopprettingen, kjøre valideringsspørringer og rive ned miljøet.

Bygge en automatisert gjenopprettingsrørledning

Nedenfor er et eksempel på et Bash-skript som kan utløses daglig av en cron-jobb eller en CI-runner (som GitLab CI eller GitHub Actions) for å validere en logisk PostgreSQL-dump.

#!/bin/bash
set -e

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

echo "[INFO] Starter automatisert gjenopprettingstest..."

# 1. Start opp en midlertidig PostgreSQL-container
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Vent på at PostgreSQL skal bli klar
echo "[INFO] Venter på at databasen skal initialiseres..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Opprett måldatabasen
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Utfør gjenopprettingen
echo "[INFO] Gjenoppretter sikkerhetskopi..."
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. Kjør logiske valideringsspørringer
echo "[INFO] Kjører valideringsspørringer..."
# Sjekk om brukertabellen har mer enn 10 000 poster
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] Logisk validering feilet. Forventet >10000 brukere, fant $USER_COUNT"
    # Utløs PagerDuty / Slack-varsel her
    exit 1
else
    echo "[SUCCESS] Logisk validering bestått. Antall brukere: $USER_COUNT"
fi

# 5. Riv ned det midlertidige miljøet
echo "[INFO] Rydder opp..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Automatisert gjenopprettingstest fullført vellykket."

Hva bør du validere?

Når du utfører automatisert gjenopprettingstesting, ikke bare sjekk om databasen starter. Kjør applikasjonsspesifikke valideringsspørringer:
1. Radantall: Sørg for at kjernetabeller har forventet antall rader (f.eks. bør ikke users-tabellen være tom).
2. Nylige data: Spør etter poster opprettet de siste 24 timene for å sikre at sikkerhetskopien ikke er utdatert.
3. Referanseintegritet: Kjør skript for å se etter foreldreløse fremmednøkler, som indikerer logisk korrupsjon.

Overvåking og varsling for avvik i sikkerhetskopier

Å oppdage korrupsjon før katastrofen inntreffer krever robust observerbarhet. Utover binære suksess/feil-tilstander, bør du overvåke metadataene til sikkerhetskopieringsjobbene dine for å oppdage avvik.

Heuristisk overvåking

Integrer metadataene for sikkerhetskopieringen i Prometheus og visualiser dem med Grafana. Sett opp varsler for følgende heuristikker:
* Plutselige størrelsesfall: Hvis den daglige sikkerhetskopien din konsekvent er 500 GB, og dagens sikkerhetskopi er 50 MB, kan jobben ha fullført vellykket (Exit Code 0), men den har sannsynligvis bare sikkerhetskopiert et tomt skjema.
* Varighetsavvik: Hvis en sikkerhetskopi som normalt tar 2 timer fullføres på 5 minutter, ble noe hoppet over. Omvendt, hvis det tar 10 timer, kan du ha disk-I/O-forringelse som kan føre til korrupsjon.
* Akkumulering av WAL/arkivlogger: Hvis databasen din genererer Write-Ahead Logs (WAL), men sikkerhetskopieringssystemet ikke arkiverer dem raskt nok, risikerer du et gap i din Point-in-Time Recovery (PITR)-kjede.

Implementering av 3-2-1-regelen med integritetssjekker

Bransjestandarden 3-2-1-regelen for sikkerhetskopiering (3 kopier av data, 2 forskjellige medier, 1 utenfor lokasjon) er bare effektiv hvis alle kopier er verifisert.

Det er her bruk av en bedriftsløsning som CloudSave reduserer driftskostnadene drastisk. I stedet for å skrive og vedlikeholde komplekse bash-skript for hver databasenode, integreres CloudSave direkte med infrastrukturen din for å automatisere 3-2-1-livssyklusen. Den tilbyr uforanderlig lagring – som beskytter mot løsepengevirus – og har innebygde, automatiserte tidsplaner for gjenopprettingsverifisering. CloudSave kan automatisk starte opp isolerte sandkassemiljøer, montere sikkerhetskopien, kjøre dine egne SQL-valideringsskript og rapportere helsestatusen tilbake til ditt sentrale dashbord.

Konklusjon

Korrupte databasesikkerhetskopier er en stille morder som kan ødelegge bedrifter. Å stole utelukkende på Exit Code 0 fra et sikkerhetskopieringsskript er et farlig sjansespill.

For å virkelig beskytte produksjonsmiljøene dine, må du ta i bruk en strategi med dybdeforsvar:
1. Aktiver kontrollsummer på sidenivå i databasedriveren din.
2. Bruk innebygde verifiseringsverktøy (pg_verifybackup, RESTORE VERIFYONLY) umiddelbart etter opprettelse av sikkerhetskopi.
3. Overvåk metadata for sikkerhetskopiering (størrelse, varighet) for heuristiske avvik.
4. Implementer automatisert, midlertidig gjenopprettingstesting som en del av din daglige operasjonelle rørledning.

Ved å skifte fra en passiv «sett det opp og glem det»-mentalitet til en aktiv «kontinuerlig gjenopprettingsvalidering»-modell, sikrer du at når katastrofen uunngåelig inntreffer, er dataene dine klare, pålitelige og fullstendig gjenopprettbare.