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.

U svijetu administracije baza podataka i inženjeringa pouzdanosti sustava (SRE) visokih uloga, postoji dobro poznati aksiom: Schrödingerova sigurnosna kopija. Stanje bilo koje sigurnosne kopije je nepoznato sve dok je ne pokušate vratiti. Do tog trenutka, ona postoji u kvantnom stanju u kojem je istovremeno savršeno ispravna i potpuno oštećena.

Za DevOps inženjere i administratore baza podataka (DBA), otkriće da je kritična sigurnosna kopija baze podataka oštećena tijekom aktivnog incidenta je scenarij iz noćne more. To pretvara rutinsku operaciju oporavka u katastrofalan gubitak podataka. Ovaj „tihi ubojica” integriteta podataka često prolazi nezapaženo jer zadaci sigurnosnog kopiranja često prijavljuju uspješan Exit Code 0 čak i kada je temeljni sadržaj kompromitiran.

U ovom sveobuhvatnom vodiču analizirat ćemo anatomiju oštećenja sigurnosnih kopija, istražiti tehnike provjere specifične za baze podataka i pokazati kako izgraditi automatizirane, neprobojne cjevovode za vraćanje podataka u produkcijskim okruženjima.

Anatomija oštećenja sigurnosne kopije

Da biste otkrili oštećenje, prvo morate razumjeti kako do njega dolazi. Oštećenje sigurnosne kopije općenito se dijeli u dvije kategorije: fizičko (na razini infrastrukture) i logičko (na razini aplikacije).

Fizičko oštećenje

Fizičko oštećenje događa se kada se stvarni bitovi na mediju za pohranu promijene. To se može dogoditi tijekom procesa čitanja s izvornog diska, tijekom prijenosa mrežom ili dok miruju na ciljnoj pohrani.
* Bit Rot (propadanje bitova): Postupna degradacija medija za pohranu može neprimjetno preokrenuti bitove.
* Pogreške u prijenosu: Iako TCP ima kontrolne zbrojeve (checksums), oni su notorno slabi (16-bitni). Okruženja s visokim protokom mogu iskusiti tiho oštećenje podataka tijekom prijenosa koje TCP ne uspijeva otkriti.
* Kvarovi kontrolera pohrane: Hardverske pogreške u RAID kontrolerima ili SAN mrežama mogu zapisati neispravne podatke dok operacijskom sustavu prijavljuju uspjeh.

Logičko oštećenje

Logičko oštećenje je vjerojatno opasnije jer je sama datoteka sigurnosne kopije savršeno netaknuta, ali su podaci unutar nje neispravni.
* Smeće unutra, smeće van (GIGO): Ako vaša aktivna baza podataka ima oštećen indeks ili oštećenu stranicu, vaš alat za sigurnosno kopiranje može vjerno kopirati tu oštećenu stranicu. Zadatak sigurnosnog kopiranja uspijeva, ali vraćanje neće uspjeti ili će rezultirati neispravnom bazom podataka.
* Nepotpune transakcije: Snimke na razini datotečnog sustava napravljene bez pravilnog zamrzavanja I/O operacija baze podataka (npr. nekoristeći FLUSH TABLES WITH READ LOCK u MySQL-u) rezultiraju oštećenim stranicama i stanjima koja se ne mogu oporaviti.

Proaktivno otkrivanje: Kontrolni zbrojevi i kriptografsko raspršivanje

Prva linija obrane od fizičkog oštećenja je kriptografska provjera. Oslanjanje na veličine datoteka ili datume izmjene nije dovoljno.

Omogućavanje kontrolnih zbrojeva na razini baze podataka

Moderni sustavi za upravljanje relacijskim bazama podataka (RDBMS) podržavaju kontrolne zbrojeve na razini stranice. Kada su omogućeni, baza podataka izračunava kontrolni zbroj za svaku stranicu prije zapisivanja na disk. Kada se stranica čita (bilo upitom ili procesom sigurnosnog kopiranja), kontrolni zbroj se provjerava.

Za PostgreSQL, možete omogućiti kontrolne zbrojeve podataka tijekom inicijalizacije klastera:

# Inicijalizirajte novi PostgreSQL klaster s omogućenim kontrolnim zbrojevima
initdb --data-checksums -D /var/lib/postgresql/data

Napomena: Ako već imate postojeći PostgreSQL klaster, možete koristiti uslužni program pg_checksums da biste ih omogućili izvanmrežno.

Za Microsoft SQL Server, osigurajte da je PAGE_VERIFY postavljen na CHECKSUM (zadano u modernim verzijama, ali vrijedi provjeriti na starijim sustavima):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Provjera sigurnosnih kopija u stanju mirovanja

Nakon što sigurnosna kopija stigne na vaše odredište za pohranu, njezin integritet mora biti kriptografski provjeren. Enterprise platforme za sigurnosno kopiranje kao što je CloudSave automatski izračunavaju i provjeravaju SHA-256 hashove blokova sigurnosne kopije tijekom prijenosa i u stanju mirovanja. Ako upravljate prilagođenim skriptama, to morate implementirati ručno:

# Generirajte SHA-256 hash nakon stvaranja sigurnosne kopije
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Provjerite hash na poslužitelju za pohranu
sha256sum -c prod_db_backup.tar.gz.sha256

Tehnike provjere specifične za baze podataka

Različiti mehanizmi baza podataka nude izvorne alate za provjeru integriteta svojih artefakata sigurnosnih kopija.

PostgreSQL: pg_verifybackup

Predstavljen u PostgreSQL-u 13, pg_verifybackup mijenja pravila igre za fizičke sigurnosne kopije napravljene pomoću pg_basebackup. On čita datoteku backup_manifest generiranu tijekom sigurnosnog kopiranja i provjerava jesu li sve datoteke prisutne i odgovaraju li njihovi kontrolni zbrojevi.

# Pokrenite provjeru nad direktorijem fizičke osnovne sigurnosne kopije
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Ako je i jedan bit promijenjen u bilo kojoj od datoteka podataka, pg_verifybackup će izbaciti fatalnu pogrešku, omogućujući vašim sustavima za nadzor da odmah upozore DBA tim.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server pruža izvornu naredbu za provjeru fizičkog integriteta datoteke sigurnosne kopije bez stvarnog vraćanja. Provjerava zaglavlja sigurnosne kopije i potvrđuje kontrolne zbrojeve stranica (ako su bili omogućeni tijekom sigurnosnog kopiranja).

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

Upozorenje: RESTORE VERIFYONLY samo potvrđuje da je datoteka sigurnosne kopije čitljiva i da se fizički kontrolni zbrojevi podudaraju. To ne jamči logički integritet. Da biste osigurali logički integritet, morate izvršiti potpuno vraćanje i pokrenuti DBCC CHECKDB.

MySQL / InnoDB: Percona XtraBackup

Za MySQL okruženja, fizičkim sigurnosnim kopijama često upravlja Percona XtraBackup. Proces sigurnosnog kopiranja sastoji se od kopiranja datoteka, ali sigurnosna kopija nije konzistentna dok se ne primijene transakcijski zapisnici (redo logs). Faza --prepare djeluje kao ugrađena provjera integriteta.

# Priprema sigurnosne kopije primjenjuje redo zapisnike. 
# Ako je sigurnosna kopija oštećena, ovaj korak neće uspjeti.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Zlatni standard: Automatizirano testiranje vraćanja podataka

Kontrolni zbrojevi i naredbe za provjeru su nužni, ali nisu dovoljni. Jedini način da se definitivno dokaže da je sigurnosna kopija ispravna jest vratiti je. U modernim DevOps okruženjima, ovaj proces mora biti potpuno automatiziran.

Tretiranjem sigurnosnih kopija kao koda, možete izgraditi CI/CD cjevovod za vraćanje vaših baza podataka. Ovaj cjevovod trebao bi osigurati efemernu infrastrukturu, izvršiti vraćanje, pokrenuti upite za provjeru i ukloniti okruženje.

Izgradnja automatiziranog cjevovoda za vraćanje

Ispod je primjer Bash skripte koju bi svakodnevno mogao pokretati cron zadatak ili CI runner (poput GitLab CI ili GitHub Actions) za provjeru PostgreSQL logičkog dumpa.

#!/bin/bash
set -e

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

echo "[INFO] Pokretanje automatiziranog testa vraćanja..."

# 1. Pokrenite efemerni PostgreSQL spremnik
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Pričekajte da PostgreSQL bude spreman
echo "[INFO] Čekanje na inicijalizaciju baze podataka..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Stvorite ciljnu bazu podataka
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Izvršite vraćanje
echo "[INFO] Vraćanje sigurnosne 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. Pokrenite upite za logičku provjeru
echo "[INFO] Pokretanje upita za provjeru..."
# Provjerite ima li tablica korisnika više od 10.000 zapisa
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čka provjera nije uspjela. Očekivano >10000 korisnika, pronađeno $USER_COUNT"
    # Ovdje pokrenite PagerDuty / Slack upozorenje
    exit 1
else
    echo "[SUCCESS] Logička provjera prošla. Broj korisnika: $USER_COUNT"
fi

# 5. Uklonite efemerno okruženje
echo "[INFO] Čišćenje..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Automatizirani test vraćanja uspješno završen."

Što trebate provjeriti?

Prilikom provođenja automatiziranog testiranja vraćanja, nemojte samo provjeravati pokreće li se baza podataka. Pokrenite upite za provjeru specifične za aplikaciju:
1. Broj redaka: Osigurajte da ključne tablice imaju očekivani broj redaka (npr. tablica users ne bi smjela biti prazna).
2. Nedavni podaci: Pretražite zapise stvorene u posljednja 24 sata kako biste osigurali da sigurnosna kopija nije zastarjela.
3. Referencijalni integritet: Pokrenite skripte za provjeru siročadi stranih ključeva, što ukazuje na logičko oštećenje.

Nadzor i upozoravanje na anomalije sigurnosnih kopija

Otkrivanje oštećenja prije katastrofe zahtijeva robusnu vidljivost. Osim binarnih stanja uspjeha/neuspjeha, trebali biste nadzirati metapodatke svojih zadataka sigurnosnog kopiranja kako biste otkrili anomalije.

Heuristički nadzor

Integrirajte metapodatke sigurnosnih kopija u Prometheus i vizualizirajte ih pomoću Grafane. Postavite upozorenja za sljedeće heuristike:
* Naglo smanjenje veličine: Ako je vaša dnevna sigurnosna kopija dosljedno 500 GB, a današnja je 50 MB, zadatak je možda uspješno dovršen (Exit Code 0), ali vjerojatno je sigurnosno kopirana prazna shema.
* Anomalije trajanja: Ako sigurnosna kopija koja obično traje 2 sata završi za 5 minuta, nešto je preskočeno. Suprotno tome, ako traje 10 sati, možda imate degradaciju I/O diska koja bi mogla dovesti do oštećenja.
* Akumulacija WAL/Archive zapisnika: Ako vaša baza podataka generira Write-Ahead Logs (WAL), ali sustav sigurnosnog kopiranja ih ne arhivira dovoljno brzo, riskirate prekid u lancu Point-in-Time Recovery (PITR).

Implementacija pravila 3-2-1 s provjerama integriteta

Industrijski standard pravila sigurnosnog kopiranja 3-2-1 (3 kopije podataka, 2 različita medija, 1 izvan lokacije) učinkovit je samo ako su sve kopije provjerene.

Ovdje korištenje enterprise rješenja kao što je CloudSave drastično smanjuje operativne troškove. Umjesto pisanja i održavanja složenih bash skripti za svaki čvor baze podataka, CloudSave se izravno integrira s vašom infrastrukturom kako bi automatizirao životni ciklus 3-2-1. Pruža nepromjenjivu pohranu—štiteći od ransomwarea—i sadrži ugrađene, automatizirane rasporede provjere vraćanja. CloudSave može automatski pokrenuti izolirana sandbox okruženja, montirati sigurnosnu kopiju, pokrenuti vaše prilagođene SQL skripte za provjeru i vratiti status zdravlja na vašu središnju nadzornu ploču.

Zaključak

Oštećene sigurnosne kopije baza podataka tihi su ubojica koji može uništiti poslovanje. Oslanjanje isključivo na Exit Code 0 skripte za sigurnosno kopiranje opasna je kocka.

Kako biste istinski zaštitili svoja produkcijska okruženja, morate usvojiti strategiju dubinske obrane:
1. Omogućite kontrolne zbrojeve na razini stranice unutar vašeg mehanizma baze podataka.
2. Koristite izvorne alate za provjeru (pg_verifybackup, RESTORE VERIFYONLY) odmah nakon stvaranja sigurnosne kopije.
3. Nadzirite metapodatke sigurnosnih kopija (veličina, trajanje) zbog heurističkih anomalija.
4. Implementirajte automatizirano, efemerno testiranje vraćanja kao dio vašeg svakodnevnog operativnog cjevovoda.

Prelaskom s pasivnog mentaliteta „postavi i zaboravi” na model „kontinuirane provjere vraćanja”, osiguravate da kada katastrofa neizbježno udari, vaši podaci budu spremni, pouzdani i potpuno oporavljivi.

Kategorije