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.

V svetu z visokimi vložki upravljanja baz podatkov in inženiringa zanesljivosti spletnih mest obstaja dobro znan aksiom: Schrödingerjeva varnostna kopija. Stanje katere koli varnostne kopije je neznano, dokler je ne poskusite obnoviti. Do tistega trenutka obstaja v kvantnem stanju, ko je hkrati popolnoma uporabna in popolnoma poškodovana.

Za DevOps inženirje in administratorje baz podatkov (DBA) je odkritje, da je kritična varnostna kopija baze podatkov poškodovana med aktivnim incidentom, scenarij najhujše nočne more. Rutinsko operacijo obnovitve spremeni v katastrofalen dogodek izgube podatkov. Ta »tihi ubijalec« celovitosti podatkov pogosto ostane neopažen, ker opravila varnostnega kopiranja pogosto poročajo o uspešni izhodni kodi 0, tudi ko je osnovna vsebina ogrožena.

V tem izčrpnem vodniku bomo razčlenili anatomijo poškodbe varnostnih kopij, raziskali tehnike preverjanja, specifične za baze podatkov, in prikazali, kako zgraditi avtomatizirane, neprebojne cevovode za obnovitev v produkcijskih okoljih.

Anatomija poškodbe varnostne kopije

Da bi odkrili poškodbo, morate najprej razumeti, kako do nje pride. Poškodba varnostne kopije na splošno spada v dve kategoriji: fizična (na ravni infrastrukture) in logična (na ravni aplikacije).

Fizična poškodba

Fizična poškodba se pojavi, ko se dejanski biti na mediju za shranjevanje spremenijo. Do tega lahko pride med postopkom branja z izvornega diska, med prenosom po omrežju ali med mirovanjem na ciljnem pomnilniku.
* Bitna gniloba (Bit Rot): Postopno poslabšanje medijev za shranjevanje lahko tiho obrne bite.
* Napake pri prenosu: Čeprav ima TCP kontrolne vsote, so te razvpito šibke (16-bitne). Okolja z visoko prepustnostjo lahko doživijo tiho poškodbo podatkov med prenosom, ki je TCP ne zazna.
* Napake krmilnika shranjevanja: Strojne napake v RAID krmilnikih ali SAN strukturah lahko zapišejo smeti, medtem ko operacijskemu sistemu poročajo o uspehu.

Logična poškodba

Logična poškodba je verjetno nevarnejša, ker je sama datoteka varnostne kopije popolnoma nepoškodovana, vendar so podatki v njej pokvarjeni.
* Smeti noter, smeti ven (GIGO): Če ima vaša aktivna baza podatkov poškodovan indeks ali strgano stran, bo vaše orodje za varnostno kopiranje zvesto kopiralo to poškodovano stran. Opravilo varnostnega kopiranja uspe, vendar bo obnovitev spodletela ali pa bo povzročila pokvarjeno bazo podatkov.
* Nepopolne transakcije: Posnetki na ravni datotečnega sistema, narejeni brez ustrezne zaustavitve V/I operacij baze podatkov (npr. brez uporabe FLUSH TABLES WITH READ LOCK v MySQL), povzročijo strgane strani in stanja, ki jih ni mogoče obnoviti.

Proaktivno odkrivanje: Kontrolne vsote in kriptografsko zgoščevanje

Prva obrambna linija proti fizični poškodbi je kriptografsko preverjanje. Zanašanje na velikosti datotek ali datume sprememb ni dovolj.

Omogočanje kontrolnih vsot na ravni baze podatkov

Sodobni relacijski sistemi za upravljanje baz podatkov (RDBMS) podpirajo kontrolne vsote na ravni strani. Ko so omogočene, baza podatkov izračuna kontrolno vsoto za vsako stran, preden jo zapiše na disk. Ko se stran prebere (bodisi s poizvedbo ali postopkom varnostnega kopiranja), se kontrolna vsota preveri.

Za PostgreSQL lahko omogočite kontrolne vsote podatkov med inicializacijo gruče:

# Inicializacija nove PostgreSQL gruče z omogočenimi kontrolnimi vsotami
initdb --data-checksums -D /var/lib/postgresql/data

Opomba: Če imate obstoječo PostgreSQL gručo, lahko uporabite pripomoček pg_checksums, da jih omogočite brez povezave.

Za Microsoft SQL Server se prepričajte, da je PAGE_VERIFY nastavljen na CHECKSUM (privzeto v sodobnih različicah, vendar je vredno preveriti pri starejših sistemih):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Preverjanje varnostnih kopij v mirovanju

Ko varnostna kopija prispe na vaš cilj za shranjevanje, je treba njeno celovitost kriptografsko preveriti. Platforme za varnostno kopiranje za podjetja, kot je CloudSave, samodejno izračunajo in preverijo SHA-256 zgoščene vrednosti blokov varnostnih kopij med prenosom in v mirovanju. Če upravljate skripte po meri, morate to implementirati ročno:

# Ustvari SHA-256 zgoščeno vrednost po ustvarjanju varnostne kopije
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Preveri zgoščeno vrednost na strežniku za shranjevanje
sha256sum -c prod_db_backup.tar.gz.sha256

Tehnike preverjanja, specifične za baze podatkov

Različni pogoni baz podatkov ponujajo izvorna orodja za preverjanje celovitosti njihovih artefaktov varnostnih kopij.

PostgreSQL: pg_verifybackup

Uveden v PostgreSQL 13, pg_verifybackup je prelomnica za fizične varnostne kopije, narejene s pg_basebackup. Prebere datoteko backup_manifest, ustvarjeno med varnostnim kopiranjem, in preveri, ali so vse datoteke prisotne in ali se njihove kontrolne vsote ujemajo.

# Zaženi preverjanje proti imeniku fizične osnovne varnostne kopije
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Če se je v kateri koli podatkovni datoteki obrnil en sam bit, bo pg_verifybackup sprožil usodno napako, kar bo vašim sistemom za spremljanje omogočilo, da takoj opozorijo ekipo DBA.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server ponuja izvorni ukaz za preverjanje fizične celovitosti datoteke varnostne kopije, ne da bi jo dejansko obnovili. Preveri glave varnostne kopije in potrdi kontrolne vsote strani (če so bile omogočene med varnostnim kopiranjem).

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

Opozorilo: RESTORE VERIFYONLY samo potrdi, da je datoteka varnostne kopije berljiva in da se fizične kontrolne vsote ujemajo. Ne zagotavlja logične celovitosti. Za zagotovitev logične celovitosti morate izvesti popolno obnovitev in zagnati DBCC CHECKDB.

MySQL / InnoDB: Percona XtraBackup

Za okolja MySQL fizične varnostne kopije pogosto obravnava Percona XtraBackup. Postopek varnostnega kopiranja je sestavljen iz kopiranja datotek, vendar varnostna kopija ni dosledna, dokler se ne uporabijo transakcijski dnevniki (redo logs). Faza --prepare deluje kot vgrajeno preverjanje celovitosti.

# Priprava varnostne kopije uporabi redo dnevnike. 
# Če je varnostna kopija poškodovana, bo ta korak spodletel.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Zlati standard: Avtomatizirano testiranje obnovitve

Kontrolne vsote in ukazi za preverjanje so potrebni, vendar niso zadostni. Edini način, da dokončno dokažete, da je varnostna kopija uporabna, je, da jo obnovite. V sodobnih DevOps okoljih mora biti ta postopek popolnoma avtomatiziran.

Z obravnavanjem varnostnih kopij kot kode lahko zgradite CI/CD cevovod za obnovitve vaših baz podatkov. Ta cevovod mora zagotoviti efemerno infrastrukturo, izvesti obnovitev, zagnati poizvedbe za preverjanje in odstraniti okolje.

Gradnja avtomatiziranega cevovoda za obnovitev

Spodaj je primer Bash skripte, ki bi jo lahko dnevno sprožilo opravilo cron ali CI izvajalec (kot sta GitLab CI ali GitHub Actions) za preverjanje logičnega izpisa PostgreSQL.

#!/bin/bash
set -e

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

echo "[INFO] Začenjam avtomatiziran test obnovitve..."

# 1. Zaženi efemerni PostgreSQL vsebnik
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Počakaj, da bo PostgreSQL pripravljen
echo "[INFO] Čakam na inicializacijo baze podatkov..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Ustvari ciljno bazo podatkov
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Izvedi obnovitev
echo "[INFO] Obnavljanje varnostne kopije..."
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. Zaženi poizvedbe za logično preverjanje
echo "[INFO] Zaganjam poizvedbe za preverjanje..."
# Preveri, ali ima tabela uporabnikov več kot 10.000 zapisov
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] Logično preverjanje ni uspelo. Pričakovano >10000 uporabnikov, najdenih $USER_COUNT"
    # Tukaj sproži PagerDuty / Slack opozorilo
    exit 1
else
    echo "[SUCCESS] Logično preverjanje uspešno. Število uporabnikov: $USER_COUNT"
fi

# 5. Odstrani efemerno okolje
echo "[INFO] Čiščenje..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Avtomatiziran test obnovitve uspešno zaključen."

Kaj morate preveriti?

Pri izvajanju avtomatiziranega testiranja obnovitve ne preverjajte le, ali se baza podatkov zažene. Zaženite poizvedbe za preverjanje, specifične za aplikacijo:
1. Število vrstic: Zagotovite, da imajo ključne tabele pričakovano število vrstic (npr. tabela users ne sme biti prazna).
2. Nedavni podatki: Poiščite zapise, ustvarjene v zadnjih 24 urah, da zagotovite, da varnostna kopija ni zastarela.
3. Referenčna celovitost: Zaženite skripte za preverjanje osirotelih tujih ključev, ki kažejo na logično poškodbo.

Spremljanje in opozarjanje na anomalije varnostnih kopij

Odkrivanje poškodb, preden pride do katastrofe, zahteva robustno opazljivost. Poleg binarnih stanj uspeha/neuspeha morate spremljati metapodatke vaših opravil varnostnega kopiranja, da zaznate anomalije.

Hevristično spremljanje

Integrirajte metapodatke varnostnih kopij v Prometheus in jih vizualizirajte z Grafano. Nastavite opozorila za naslednje hevristike:
* Nenadni padci velikosti: Če je vaša dnevna varnostna kopija dosledno velika 500 GB, današnja pa 50 MB, se je opravilo morda uspešno zaključilo (izhodna koda 0), vendar je verjetno varnostno kopiralo prazno shemo.
* Anomalije trajanja: Če se varnostno kopiranje, ki običajno traja 2 uri, zaključi v 5 minutah, je bilo nekaj izpuščeno. Nasprotno, če traja 10 ur, imate morda degradacijo V/I diska, ki bi lahko vodila do poškodbe.
* Kopičenje WAL/arhivskih dnevnikov: Če vaša baza podatkov ustvarja dnevnike Write-Ahead Logs (WAL), sistem za varnostno kopiranje pa jih ne arhivira dovolj hitro, tvegate vrzel v vaši verigi obnovitve do določenega trenutka (PITR).

Implementacija pravila 3-2-1 s preverjanjem celovitosti

Industrijsko standardno pravilo varnostnega kopiranja 3-2-1 (3 kopije podatkov, 2 različna medija, 1 zunaj lokacije) je učinkovito le, če so vse kopije preverjene.

Tu uporaba rešitve za podjetja, kot je CloudSave, drastično zmanjša operativne stroške. Namesto pisanja in vzdrževanja zapletenih bash skript za vsako vozlišče baze podatkov, se CloudSave neposredno integrira z vašo infrastrukturo za avtomatizacijo življenjskega cikla 3-2-1. Zagotavlja nespremenljivo shranjevanje – zaščito pred izsiljevalsko programsko opremo – in vključuje vgrajene, avtomatizirane urnike preverjanja obnovitve. CloudSave lahko samodejno zažene izolirana peskovniška okolja, namesti varnostno kopijo, zažene vaše skripte za preverjanje SQL po meri in poroča o stanju zdravja nazaj na vašo osrednjo nadzorno ploščo.

Zaključek

Poškodovane varnostne kopije baz podatkov so tihi ubijalec, ki lahko uniči podjetja. Zanašanje izključno na izhodno kodo 0 skripte za varnostno kopiranje je nevarna igra na srečo.

Za resnično zaščito vaših produkcijskih okolij morate sprejeti strategijo poglobljene obrambe:
1. Omogočite kontrolne vsote na ravni strani znotraj vašega pogona baze podatkov.
2. Takoj po ustvarjanju varnostne kopije uporabite izvorna orodja za preverjanje (pg_verifybackup, RESTORE VERIFYONLY).
3. Spremljajte metapodatke varnostnih kopij (velikost, trajanje) za hevristične anomalije.
4. Kot del vašega dnevnega operativnega cevovoda implementirajte avtomatizirano, efemerno testiranje obnovitve.

S prehodom s pasivne miselnosti »nastavi in pozabi« na model »nenehnega preverjanja obnovitve« zagotovite, da bodo vaši podatki pripravljeni, zanesljivi in popolnoma obnovljivi, ko neizogibno pride do katastrofe.