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.

Katika ulimwengu wa usimamizi wa hifadhidata na uhandisi wa kutegemewa kwa tovuti (SRE), kuna kanuni inayojulikana sana: Hifadhi Nakala ya Schrödinger. Hali ya hifadhi nakala yoyote haijulikani hadi utakapojaribu kuirejesha. Hadi wakati huo, ipo katika hali ya kifizikia ya kuwa na uwezo wa kufanya kazi kikamilifu na pia kuharibika kabisa.

Kwa wahandisi wa DevOps na wasimamizi wa hifadhidata (DBAs), kugundua kuwa hifadhi nakala muhimu ya hifadhidata imeharibika wakati wa tukio la dharura ni ndoto mbaya zaidi. Inabadilisha operesheni ya kawaida ya kurejesha data kuwa janga la kupoteza data. “Muuaji huyu kimya” wa uadilifu wa data mara nyingi haonekani kwa sababu kazi za kuhifadhi nakala mara nyingi huripoti Exit Code 0 yenye mafanikio hata wakati data iliyomo imeharibika.

Katika mwongozo huu wa kina, tutachambua muundo wa uharibifu wa hifadhi nakala, kuchunguza mbinu za uthibitishaji mahususi kwa hifadhidata, na kuonyesha jinsi ya kujenga mifumo ya kurejesha data iliyojiendesha na isiyoweza kushindwa kwa mazingira ya uzalishaji.

Muundo wa Uharibifu wa Hifadhi Nakala

Ili kugundua uharibifu, lazima kwanza uelewe jinsi unavyotokea. Uharibifu wa hifadhi nakala kwa ujumla huangukia katika makundi mawili: ya kimwili (kiwango cha miundombinu) na ya kimantiki (kiwango cha programu).

Uharibifu wa Kimwili

Uharibifu wa kimwili hutokea wakati biti halisi kwenye kifaa cha kuhifadhia data zinapobadilishwa. Hii inaweza kutokea wakati wa mchakato wa kusoma kutoka kwenye diski chanzo, wakati wa usafirishaji kwenye mtandao, au wakati data imetulia kwenye hifadhi lengwa.
* Bit Rot: Uharibifu wa taratibu wa vyombo vya kuhifadhia data unaweza kubadilisha biti kimya kimya.
* Hitilafu za Usafirishaji: Ingawa TCP ina checksums, ni dhaifu sana (16-bit). Mazingira yenye kasi kubwa ya data yanaweza kupata uharibifu wa data kimya kimya kwenye waya ambao TCP inashindwa kuugundua.
* Hitilafu za Kidhibiti cha Hifadhi: Hitilafu za vifaa katika vidhibiti vya RAID au mifumo ya SAN zinaweza kuandika data taka huku zikiripoti mafanikio kwa mfumo wa uendeshaji (OS).

Uharibifu wa Kimantiki

Uharibifu wa kimantiki unaweza kusemwa kuwa hatari zaidi kwa sababu faili ya hifadhi nakala yenyewe iko sawa, lakini data iliyo ndani yake imevunjika.
* Taka Ndani, Taka Nje (GIGO): Ikiwa hifadhidata yako ya moja kwa moja ina index iliyoharibika au ukurasa uliopasuka, zana yako ya kuhifadhi nakala inaweza kunakili ukurasa huo ulioharibika kwa uaminifu. Kazi ya kuhifadhi nakala inafanikiwa, lakini urejeshaji utashindwa au utatoa hifadhidata iliyovunjika.
* Miamala Isiyokamilika: Picha za mfumo wa faili (snapshots) zinazochukuliwa bila kugandisha I/O ya hifadhidata ipasavyo (kwa mfano, kutotumia FLUSH TABLES WITH READ LOCK katika MySQL) husababisha kurasa zilizopasuka na hali zisizoweza kurejeshwa.

Ugunduzi wa Mapema: Checksums na Cryptographic Hashing

Mstari wa kwanza wa ulinzi dhidi ya uharibifu wa kimwili ni uthibitishaji wa kriptografia. Kutegemea ukubwa wa faili au tarehe za kurekebishwa hakutoshi.

Kuwezesha Checksums za Kiwango cha Hifadhidata

Mifumo ya kisasa ya usimamizi wa hifadhidata (RDBMS) inasaidia checksums za kiwango cha ukurasa. Inapowezeshwa, hifadhidata huhesabu checksum kwa kila ukurasa kabla ya kuuandika kwenye diski. Wakati ukurasa unasomwa (iwe na hoja au mchakato wa kuhifadhi nakala), checksum inathibitishwa.

Kwa PostgreSQL, unaweza kuwezesha checksums za data wakati wa kuanzisha cluster:

# Anzisha PostgreSQL cluster mpya ikiwa checksums zimewezeshwa
initdb --data-checksums -D /var/lib/postgresql/data

Kumbuka: Ikiwa una PostgreSQL cluster iliyopo, unaweza kutumia matumizi ya pg_checksums kuyawezesha nje ya mtandao.

Kwa Microsoft SQL Server, hakikisha kuwa PAGE_VERIFY imewekwa kuwa CHECKSUM (chaguo-msingi katika matoleo ya kisasa, lakini inafaa kuhakiki kwenye mifumo ya zamani):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Kuhakiki Hifadhi Nakala Zilizotulia

Mara tu hifadhi nakala inapofika kwenye lengo lako la kuhifadhia, uadilifu wake lazima uthibitishwe kwa njia ya kriptografia. Mifumo ya biashara ya kuhifadhi nakala kama CloudSave huhesabu na kuhakiki kiotomatiki hash za SHA-256 za vizuizi vya hifadhi nakala wakati wa usafirishaji na wakati imetulia. Ikiwa unasimamia hati maalum, lazima utekeleze hili kwa mikono:

# Tengeneza hash ya SHA-256 baada ya kuunda hifadhi nakala
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Hakiki hash kwenye seva ya hifadhi
sha256sum -c prod_db_backup.tar.gz.sha256

Mbinu za Uthibitishaji Mahususi kwa Hifadhidata

Injini tofauti za hifadhidata hutoa zana asilia za kuhakiki uadilifu wa vitu vyao vya hifadhi nakala.

PostgreSQL: pg_verifybackup

Iliyotambulishwa katika PostgreSQL 13, pg_verifybackup ni mabadiliko makubwa kwa hifadhi nakala za kimwili zilizochukuliwa na pg_basebackup. Inasoma faili ya backup_manifest iliyozalishwa wakati wa kuhifadhi nakala na kuhakiki kuwa faili zote zipo na checksum zao zinalingana.

# Endesha uthibitishaji dhidi ya saraka ya hifadhi nakala ya kimwili
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Ikiwa biti moja imebadilika katika faili yoyote ya data, pg_verifybackup itatoa hitilafu mbaya, ikiruhusu mifumo yako ya ufuatiliaji kuita timu ya DBA mara moja.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server hutoa amri asilia ya kuhakiki uadilifu wa kimwili wa faili ya hifadhi nakala bila kuirejesha. Inakagua vichwa vya hifadhi nakala na kuhakiki checksums za ukurasa (ikiwa ziliwezeshwa wakati wa kuhifadhi nakala).

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

Onyo: RESTORE VERIFYONLY inathibitisha tu kuwa faili ya hifadhi nakala inaweza kusomeka na checksums za kimwili zinalingana. Haikuhakikishii uadilifu wa kimantiki. Ili kuhakikisha uadilifu wa kimantiki, lazima ufanye urejeshaji kamili na uendeshe DBCC CHECKDB.

MySQL / InnoDB: Percona XtraBackup

Kwa mazingira ya MySQL, hifadhi nakala za kimwili mara nyingi hushughulikiwa na Percona XtraBackup. Mchakato wa kuhifadhi nakala unajumuisha kunakili faili, lakini hifadhi nakala haijakamilika hadi miamala ya kumbukumbu (redo logs) itumike. Awamu ya --prepare hufanya kazi kama ukaguzi wa uadilifu uliojengwa ndani.

# Kuandaa hifadhi nakala kunatumia redo logs. 
# Ikiwa hifadhi nakala imeharibika, hatua hii itashindwa.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Kiwango cha Dhahabu: Upimaji wa Urejeshaji Uliojiendesha

Checksums na amri za uthibitishaji ni muhimu, lakini hazitoshi. Njia pekee ya kuthibitisha bila shaka kuwa hifadhi nakala inafaa ni kuirejesha. Katika mazingira ya kisasa ya DevOps, mchakato huu lazima uwe wa kiotomatiki kikamilifu.

Kwa kuchukulia hifadhi nakala kama msimbo, unaweza kujenga mfumo wa CI/CD kwa urejeshaji wa hifadhidata yako. Mfumo huu unapaswa kutoa miundombinu ya muda, kutekeleza urejeshaji, kuendesha hoja za uthibitishaji, na kuondoa mazingira hayo.

Kujenga Mfumo wa Urejeshaji Uliojiendesha

Hapo chini kuna mfano wa hati ya Bash ambayo inaweza kuanzishwa kila siku na cron job au CI runner (kama GitLab CI au GitHub Actions) ili kuhakiki dump ya kimantiki ya PostgreSQL.

#!/bin/bash
set -e

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

echo "[INFO] Kuanzisha Jaribio la Urejeshaji Uliojiendesha..."

# 1. Anzisha kontena la muda la PostgreSQL
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Subiri PostgreSQL iwe tayari
echo "[INFO] Inasubiri hifadhidata kuanzishwa..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Unda hifadhidata lengwa
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Tekeleza urejeshaji
echo "[INFO] Inarejesha hifadhi nakala..."
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. Endesha Hoja za Uthibitishaji wa Kimantiki
echo "[INFO] Inaendesha hoja za uthibitishaji..."
# Angalia ikiwa jedwali la watumiaji lina rekodi zaidi ya 10,000
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] Uthibitishaji wa kimantiki umeshindwa. Inatarajiwa >10000 watumiaji, imepatikana $USER_COUNT"
    # Anzisha tahadhari ya PagerDuty / Slack hapa
    exit 1
else
    echo "[SUCCESS] Uthibitishaji wa kimantiki umefaulu. Idadi ya watumiaji: $USER_COUNT"
fi

# 5. Ondoa mazingira ya muda
echo "[INFO] Inasafisha..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Jaribio la Urejeshaji Uliojiendesha Limemalizika kwa Mafanikio."

Unapaswa Kuhakiki Nini?

Unapofanya upimaji wa urejeshaji ulijiendesha, usikague tu ikiwa hifadhidata inaanza. Endesha hoja za uthibitishaji mahususi kwa programu:
1. Idadi ya Safu: Hakikisha majedwali makuu yana idadi ya safu inayotarajiwa (kwa mfano, jedwali la users halipaswi kuwa tupu).
2. Data ya Hivi Karibuni: Uliza rekodi zilizoundwa katika saa 24 zilizopita ili kuhakikisha hifadhi nakala si ya zamani.
3. Uadilifu wa Marejeleo: Endesha hati za kukagua funguo za kigeni (foreign keys) zilizopotea, ambazo zinaonyesha uharibifu wa kimantiki.

Ufuatiliaji na Tahadhari kwa Hitilafu za Hifadhi Nakala

Kugundua uharibifu kabla ya janga kutokea kunahitaji uwezo mkubwa wa kuona. Zaidi ya hali za binary za mafanikio/kushindwa, unapaswa kufuatilia metadata ya kazi zako za kuhifadhi nakala ili kugundua hitilafu.

Ufuatiliaji wa Heuristic

Unganisha metadata yako ya hifadhi nakala kwenye Prometheus na uionyeshe kwa Grafana. Weka tahadhari kwa heuristics zifuatazo:
* Kushuka kwa Ukubwa kwa Ghafla: Ikiwa hifadhi nakala yako ya kila siku ni 500GB, na ya leo ni 50MB, kazi inaweza kuwa imekamilika kwa mafanikio (Exit Code 0), lakini inawezekana ilihifadhi schema tupu.
* Hitilafu za Muda: Ikiwa hifadhi nakala ambayo kwa kawaida huchukua saa 2 inamalizika kwa dakika 5, kuna kitu kimerukwa. Kinyume chake, ikiwa inachukua saa 10, unaweza kuwa na uharibifu wa I/O ya diski ambao unaweza kusababisha uharibifu.
* Mkusanyiko wa WAL/Archive Log: Ikiwa hifadhidata yako inazalisha Write-Ahead Logs (WAL) lakini mfumo wa kuhifadhi nakala hauzihifadhi haraka vya kutosha, unahatarisha pengo katika mnyororo wako wa Point-in-Time Recovery (PITR).

Utekelezaji wa Kanuni ya 3-2-1 na Ukaguzi wa Uadilifu

Kanuni ya kawaida ya sekta ya 3-2-1 ya kuhifadhi nakala (nakala 3 za data, vyombo 2 tofauti, 1 nje ya tovuti) inafaa tu ikiwa nakala zote zimehakikiwa.

Hapa ndipo kutumia suluhisho la biashara kama CloudSave kunapunguza kwa kiasi kikubwa gharama za uendeshaji. Badala ya kuandika na kudumisha hati ngumu za bash kwa kila node ya hifadhidata, CloudSave inaunganishwa moja kwa moja na miundombinu yako ili kujiendesha mzunguko wa 3-2-1. Inatoa hifadhi isiyoweza kubadilika—ikilinda dhidi ya ransomware—na ina ratiba zilizojengwa ndani za uthibitishaji wa urejeshaji ulijiendesha. CloudSave inaweza kuanzisha kiotomatiki mazingira ya sandbox yaliyotengwa, kuweka hifadhi nakala, kuendesha hati zako maalum za uthibitishaji wa SQL, na kuripoti hali ya afya kwenye dashibodi yako kuu.

Hitimisho

Hifadhi nakala za hifadhidata zilizoharibika ni muuaji kimya anayeweza kuharibu biashara. Kutegemea pekee Exit Code 0 ya hati ya kuhifadhi nakala ni kamari hatari.

Ili kulinda kikweli mazingira yako ya uzalishaji, lazima utumie mkakati wa ulinzi wa kina:
1. Washa checksums za kiwango cha ukurasa ndani ya injini yako ya hifadhidata.
2. Tumia zana asilia za uthibitishaji (pg_verifybackup, RESTORE VERIFYONLY) mara tu baada ya kuunda hifadhi nakala.
3. Fuatilia metadata ya hifadhi nakala (ukubwa, muda) kwa hitilafu za heuristic.
4. Tekeleza upimaji wa urejeshaji ulijiendesha kama sehemu ya mzunguko wako wa kila siku wa uendeshaji.

Kwa kuhama kutoka kwa mawazo ya “hifadhi na usahau” hadi mfano wa “uthibitishaji wa urejeshaji unaoendelea”, unahakikisha kuwa janga linapotokea, data yako iko tayari, inategemeka, na inaweza kurejeshwa kikamilifu.