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.

Տվյալների բազայի կառավարման և կայքի հուսալիության ինժեներիայի բարձր պատասխանատվություն պահանջող աշխարհում գոյություն ունի մի հայտնի աքսիոմ՝ Շրյոդինգերի պահուստային պատճենը (Schrödinger’s Backup): Ցանկացած պահուստային պատճենի վիճակն անհայտ է, քանի դեռ չեք փորձել այն վերականգնել: Մինչ այդ պահը այն գոյություն ունի քվանտային վիճակում՝ լինելով միաժամանակ և՛ կատարյալ պիտանի, և՛ ամբողջությամբ վնասված:

DevOps ինժեներների և տվյալների բազայի ադմինիստրատորների (DBA) համար ակտիվ միջադեպի ժամանակ պարզելը, որ տվյալների բազայի կարևոր պահուստային պատճենը վնասված է, վերջնական մղձավանջային սցենար է: Այն վերածում է սովորական վերականգնման գործընթացը տվյալների կորստի աղետալի դեպքի: Տվյալների ամբողջականության այս «լուռ մարդասպանը» հաճախ աննկատ է մնում, քանի որ պահուստավորման առաջադրանքները հաճախ հաղորդում են հաջող Exit Code 0, նույնիսկ երբ հիմքում ընկած տվյալները վնասված են:

Այս համապարփակ ուղեցույցում մենք կվերլուծենք պահուստային պատճենների վնասվածության անատոմիան, կուսումնասիրենք տվյալների բազայի համար նախատեսված վավերացման տեխնիկաները և ցույց կտանք, թե ինչպես կառուցել ավտոմատացված, անխոցելի վերականգնման խողովակաշարեր (pipelines) արտադրական միջավայրերի համար:

Պահուստային պատճենների վնասվածության անատոմիան

Վնասվածությունը հայտնաբերելու համար նախ պետք է հասկանալ, թե ինչպես է այն առաջանում: Պահուստային պատճենների վնասվածությունը սովորաբար բաժանվում է երկու կատեգորիայի՝ ֆիզիկական (ենթակառուցվածքային մակարդակ) և տրամաբանական (հավելվածի մակարդակ):

Ֆիզիկական վնասվածություն

Ֆիզիկական վնասվածությունը տեղի է ունենում, երբ պահեստավորման միջավայրի իրական բիթերը փոխվում են: Սա կարող է տեղի ունենալ սկավառակից ընթերցման գործընթացում, ցանցով փոխանցման ժամանակ կամ թիրախային պահեստում պահվելիս:
* Բիթերի քայքայում (Bit Rot): Պահեստավորման միջավայրի աստիճանական քայքայումը կարող է լուռ փոխել բիթերը:
* Փոխանցման սխալներ: Թեև TCP-ն ունի ստուգաթվեր (checksums), դրանք հայտնի են իրենց թուլությամբ (16-բիթանոց): Բարձր թողունակությամբ միջավայրերը կարող են ցանցով տվյալների լուռ կոռուպցիա ունենալ, որը TCP-ն չի հայտնաբերում:
* Պահեստավորման կառավարչի անսարքություններ: RAID կառավարիչների կամ SAN ցանցերի ծրագրային սխալները կարող են աղբ տվյալներ գրել՝ օպերացիոն համակարգին հաղորդելով հաջողության մասին:

Տրամաբանական վնասվածություն

Տրամաբանական վնասվածությունը, թերևս, ավելի վտանգավոր է, քանի որ պահուստային ֆայլն ինքնին կատարյալ անվնաս է, բայց դրա ներսում եղած տվյալները՝ կոտրված:
* Աղբ մուտքում, աղբ ելքում (GIGO): Եթե ձեր աշխատանքային տվյալների բազան ունի վնասված ինդեքս կամ վնասված էջ, ձեր պահուստավորման գործիքը կարող է հավատարմորեն պատճենել այդ վնասված էջը: Պահուստավորման առաջադրանքը հաջողվում է, բայց վերականգնումը կձախողվի կամ կստեղծի կոտրված տվյալների բազա:
* Անավարտ գործարքներ: Ֆայլային համակարգի մակարդակի պատկերները (snapshots), որոնք արվել են առանց տվյալների բազայի I/O-ն պատշաճ կերպով սառեցնելու (օրինակ՝ MySQL-ում FLUSH TABLES WITH READ LOCK չօգտագործելը), հանգեցնում են վնասված էջերի և անվերականգնելի վիճակների:

Նախաձեռնողական հայտնաբերում. Ստուգաթվեր և կրիպտոգրաֆիկ հեշավորում

Ֆիզիկական վնասվածության դեմ պաշտպանության առաջին գիծը կրիպտոգրաֆիկ վավերացումն է: Միայն ֆայլերի չափերի կամ փոփոխման ամսաթվերի վրա հույս դնելը բավարար չէ:

Տվյալների բազայի մակարդակում ստուգաթվերի միացում

Ժամանակակից հարաբերական տվյալների բազայի կառավարման համակարգերը (RDBMS) աջակցում են էջի մակարդակի ստուգաթվերին: Երբ միացված է, տվյալների բազան հաշվարկում է ստուգաթիվ յուրաքանչյուր էջի համար՝ նախքան այն սկավառակի վրա գրելը: Երբ էջը կարդացվում է (հարցման կամ պահուստավորման գործընթացի միջոցով), ստուգաթիվը ստուգվում է:

PostgreSQL-ի համար դուք կարող եք միացնել տվյալների ստուգաթվերը կլաստերի նախնական կարգավորման ժամանակ.

# Նոր PostgreSQL կլաստերի նախնական կարգավորում՝ միացված ստուգաթվերով
initdb --data-checksums -D /var/lib/postgresql/data

Նշում. Եթե ունեք գործող PostgreSQL կլաստեր, կարող եք օգտագործել pg_checksums օգտակար ծրագիրը՝ դրանք օֆլայն ռեժիմում միացնելու համար:

Microsoft SQL Server-ի համար համոզվեք, որ PAGE_VERIFY-ը սահմանված է CHECKSUM (ժամանակակից տարբերակներում լռելյայն է, բայց արժե ստուգել հին համակարգերում).

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Պահուստային պատճենների վավերացում պահեստում

Երբ պահուստային պատճենը հասնում է ձեր պահեստավորման թիրախին, դրա ամբողջականությունը պետք է կրիպտոգրաֆիկորեն ստուգվի: Ձեռնարկատիրական պահուստավորման հարթակները, ինչպիսին է CloudSave-ը, ավտոմատ կերպով հաշվարկում և ստուգում են պահուստային բլոկների SHA-256 հեշերը փոխանցման և պահպանման ընթացքում: Եթե դուք կառավարում եք հատուկ սկրիպտներ, պետք է դա իրականացնեք ձեռքով.

# SHA-256 հեշի գեներացում պահուստային պատճենի ստեղծումից հետո
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Հեշի ստուգում պահեստավորման սերվերում
sha256sum -c prod_db_backup.tar.gz.sha256

Տվյալների բազայի համար նախատեսված վավերացման տեխնիկաներ

Տվյալների բազայի տարբեր շարժիչներ առաջարկում են ներկառուցված գործիքներ՝ պահուստային արտեֆակտների ամբողջականությունը ստուգելու համար:

PostgreSQL: pg_verifybackup

PostgreSQL 13-ում ներկայացված pg_verifybackup-ը հեղափոխական է pg_basebackup-ով արված ֆիզիկական պահուստային պատճենների համար: Այն կարդում է պահուստավորման ժամանակ գեներացված backup_manifest ֆայլը և ստուգում, որ բոլոր ֆայլերը առկա են, և դրանց ստուգաթվերը համընկնում են:

# Վավերացման գործարկում ֆիզիկական բազային պահուստային պատճենի գրացուցակի համար
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Եթե տվյալների ֆայլերից որևէ մեկում նույնիսկ մեկ բիթ փոխված լինի, pg_verifybackup-ը կտա ճակատագրական սխալ, ինչը թույլ կտա ձեր մոնիտորինգի համակարգերին անմիջապես ծանուցել DBA թիմին:

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server-ը տրամադրում է ներկառուցված հրաման՝ պահուստային ֆայլի ֆիզիկական ամբողջականությունը ստուգելու համար՝ առանց այն իրականում վերականգնելու: Այն ստուգում է պահուստային պատճենի վերնագրերը և վավերացնում էջի ստուգաթվերը (եթե դրանք միացված են եղել պահուստավորման ժամանակ):

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

Զգուշացում. RESTORE VERIFYONLY-ը միայն հաստատում է, որ պահուստային ֆայլը ընթեռնելի է և ֆիզիկական ստուգաթվերը համընկնում են: Այն չի երաշխավորում տրամաբանական ամբողջականությունը: Տրամաբանական ամբողջականությունը ապահովելու համար դուք պետք է կատարեք ամբողջական վերականգնում և գործարկեք DBCC CHECKDB:

MySQL / InnoDB: Percona XtraBackup

MySQL միջավայրերի համար ֆիզիկական պահուստային պատճենները հաճախ կառավարվում են Percona XtraBackup-ի կողմից: Պահուստավորման գործընթացը բաղկացած է ֆայլերի պատճենումից, բայց պահուստային պատճենը հետևողական չէ, քանի դեռ գործարքների մատյանները (redo logs) չեն կիրառվել: --prepare փուլը գործում է որպես ներկառուցված ամբողջականության ստուգում:

# Պահուստային պատճենի պատրաստումը կիրառում է redo logs-ը: 
# Եթե պահուստային պատճենը վնասված է, այս քայլը կձախողվի:
xtrabackup --prepare --target-dir=/data/backups/mysql/

Ոսկե ստանդարտ. Ավտոմատացված վերականգնման թեստավորում

Ստուգաթվերը և վավերացման հրամանները անհրաժեշտ են, բայց դրանք բավարար չեն: Պահուստային պատճենի պիտանիությունը վերջնականապես ապացուցելու միակ միջոցը այն վերականգնելն է: Ժամանակակից DevOps միջավայրերում այս գործընթացը պետք է լինի լիովին ավտոմատացված:

Պահուստային պատճենները որպես կոդ դիտարկելով՝ դուք կարող եք կառուցել CI/CD խողովակաշար ձեր տվյալների բազայի վերականգնումների համար: Այս խողովակաշարը պետք է տրամադրի ժամանակավոր ենթակառուցվածք, իրականացնի վերականգնումը, գործարկի վավերացման հարցումներ և հեռացնի միջավայրը:

Ավտոմատացված վերականգնման խողովակաշարի կառուցում

Ստորև բերված է Bash սկրիպտի օրինակ, որը կարող է ամեն օր գործարկվել cron job-ի կամ CI runner-ի (օրինակ՝ GitLab CI կամ GitHub Actions) կողմից՝ PostgreSQL տրամաբանական դամփը վավերացնելու համար.

#!/bin/bash
set -e

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

echo "[INFO] Ավտոմատացված վերականգնման թեստի մեկնարկ..."

# 1. Ժամանակավոր PostgreSQL կոնտեյների գործարկում
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Սպասել մինչև PostgreSQL-ը պատրաստ լինի
echo "[INFO] Սպասում ենք տվյալների բազայի նախնական կարգավորմանը..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Թիրախային տվյալների բազայի ստեղծում
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Վերականգնման իրականացում
echo "[INFO] Վերականգնում ենք պահուստային պատճենը..."
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. Տրամաբանական վավերացման հարցումների գործարկում
echo "[INFO] Վավերացման հարցումների գործարկում..."
# Ստուգել, արդյոք users աղյուսակն ունի 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] Տրամաբանական վավերացումը ձախողվեց: Ակնկալվում էր >10000 օգտատեր, գտնվել է $USER_COUNT"
    # Այստեղ ակտիվացրեք PagerDuty / Slack ծանուցումը
    exit 1
else
    echo "[SUCCESS] Տրամաբանական վավերացումը հաջողվեց: Օգտատերերի քանակը՝ $USER_COUNT"
fi

# 5. Ժամանակավոր միջավայրի հեռացում
echo "[INFO] Մաքրում ենք..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Ավտոմատացված վերականգնման թեստը հաջողությամբ ավարտվեց:"

Ի՞նչ պետք է վավերացնել

Ավտոմատացված վերականգնման թեստավորում կատարելիս միայն մի ստուգեք, թե արդյոք տվյալների բազան աշխատում է: Գործարկեք հավելվածի համար հատուկ վավերացման հարցումներ.
1. Տողերի քանակը (Row Counts): Համոզվեք, որ հիմնական աղյուսակներն ունեն ակնկալվող քանակի տողեր (օրինակ՝ users աղյուսակը չպետք է դատարկ լինի):
2. Վերջին տվյալները: Հարցրեք վերջին 24 ժամվա ընթացքում ստեղծված գրառումները՝ համոզվելու համար, որ պահուստային պատճենը հնացած չէ:
3. Հղումային ամբողջականություն (Referential Integrity): Գործարկեք սկրիպտներ՝ որբացած արտաքին բանալիները ստուգելու համար, որոնք վկայում են տրամաբանական վնասվածության մասին:

Մոնիտորինգ և ծանուցում պահուստային պատճենների անոմալիաների համար

Աղետից առաջ վնասվածությունը հայտնաբերելը պահանջում է հուսալի դիտարկելիություն: Բացի հաջող/ձախողված վիճակներից, դուք պետք է մոնիտորինգի ենթարկեք ձեր պահուստավորման առաջադրանքների մետատվյալները՝ անոմալիաները հայտնաբերելու համար:

Էվրիստիկ մոնիտորինգ

Ինտեգրեք ձեր պահուստավորման մետատվյալները Prometheus-ի հետ և վիզուալացրեք դրանք Grafana-ի միջոցով: Սահմանեք ծանուցումներ հետևյալ էվրիստիկաների համար.
* Չափի հանկարծակի նվազում. Եթե ձեր ամենօրյա պահուստային պատճենը կայուն 500 ԳԲ է, իսկ այսօրվանը՝ 50 ՄԲ, ապա առաջադրանքը կարող է հաջողությամբ ավարտված լինել (Exit Code 0), բայց հավանաբար այն պահուստավորել է դատարկ սխեման:
* Տևողության անոմալիաներ. Եթե պահուստավորումը, որը սովորաբար տևում է 2 ժամ, ավարտվում է 5 րոպեում, ինչ-որ բան բաց է թողնվել: Հակառակը, եթե այն տևում է 10 ժամ, հնարավոր է՝ ունեք սկավառակի I/O-ի քայքայում, որը կարող է հանգեցնել վնասվածության:
* WAL/Արխիվային մատյանների կուտակում. Եթե ձեր տվյալների բազան գեներացնում է Write-Ahead Logs (WAL), բայց պահուստավորման համակարգը դրանք բավարար արագ չի արխիվացնում, դուք ռիսկի եք դիմում կորցնելու ձեր Point-in-Time Recovery (PITR) շղթան:

3-2-1 կանոնի իրականացում ամբողջականության ստուգումներով

Արդյունաբերության ստանդարտ 3-2-1 պահուստավորման կանոնը (տվյալների 3 պատճեն, 2 տարբեր կրիչներ, 1-ը՝ օֆսայթ) արդյունավետ է միայն այն դեպքում, եթե բոլոր պատճենները ստուգված են:

Այստեղ է, որ CloudSave-ի նման ձեռնարկատիրական լուծումը կտրուկ նվազեցնում է գործառնական ծախսերը: Փոխանակ յուրաքանչյուր տվյալների բազայի հանգույցի համար բարդ bash սկրիպտներ գրելու և պահպանելու, CloudSave-ը անմիջականորեն ինտեգրվում է ձեր ենթակառուցվածքին՝ 3-2-1 կենսացիկլը ավտոմատացնելու համար: Այն տրամադրում է անփոփոխելի պահեստավորում՝ պաշտպանելով ransomware-ից, և ունի ներկառուցված, ավտոմատացված վերականգնման վավերացման ժամանակացույցեր: CloudSave-ը կարող է ավտոմատ կերպով գործարկել մեկուսացված sandbox միջավայրեր, տեղադրել պահուստային պատճենը, գործարկել ձեր հատուկ SQL վավերացման սկրիպտները և առողջության կարգավիճակի մասին հաշվետվություն ուղարկել ձեր կենտրոնական վահանակին:

Եզրակացություն

Տվյալների բազայի վնասված պահուստային պատճենները լուռ մարդասպան են, որոնք կարող են ոչնչացնել բիզնեսը: Միայն պահուստավորման սկրիպտի Exit Code 0-ի վրա հույս դնելը վտանգավոր խաղ է:

Ձեր արտադրական միջավայրերը իսկապես պաշտպանելու համար դուք պետք է որդեգրեք խորը պաշտպանության ռազմավարություն.
1. Միացրեք էջի մակարդակի ստուգաթվերը ձեր տվյալների բազայի շարժիչում:
2. Օգտագործեք ներկառուցված վավերացման գործիքներ (pg_verifybackup, RESTORE VERIFYONLY) պահուստավորման ստեղծումից անմիջապես հետո:
3. Մոնիտորինգի ենթարկեք պահուստավորման մետատվյալները (չափը, տևողությունը) էվրիստիկ անոմալիաների համար:
4. Իրականացրեք ավտոմատացված, ժամանակավոր վերականգնման թեստավորում՝ որպես ձեր ամենօրյա գործառնական խողովակաշարի մաս:

Պասիվ «գործարկիր և մոռացիր» պահուստավորման մտածելակերպից անցնելով ակտիվ «շարունակական վերականգնման վավերացման» մոդելին՝ դուք ապահովում եք, որ երբ աղետը անխուսափելիորեն տեղի ունենա, ձեր տվյալները պատրաստ են, հուսալի և լիովին վերականգնելի:

Կարգեր