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.

Ma’lumotlar bazasini boshqarish va sayt ishonchliligini ta’minlash (SRE) kabi yuqori mas’uliyatli sohalarda yaxshi ma’lum bo’lgan bir aksioma mavjud: Shryodinger zaxira nusxasi. Har qanday zaxira nusxasining holati uni tiklashga urinmaguningizcha noma’lum bo’lib qoladi. O’sha lahzagacha u ham mukammal darajada yaroqli, ham butunlay buzilgan kvant holatida mavjud bo’ladi.

DevOps muhandislari va ma’lumotlar bazasi ma’murlari (DBA) uchun faol hodisa vaqtida muhim ma’lumotlar bazasi zaxira nusxasining buzilganligini aniqlash eng dahshatli stsenariydir. Bu odatiy tiklash jarayonini halokatli ma’lumotlar yo’qolishi voqeasiga aylantiradi. Ma’lumotlar yaxlitligining bu «yashirin qotili» ko’pincha e’tibordan chetda qoladi, chunki zaxira nusxalash vazifalari asosiy ma’lumotlar buzilgan bo’lsa ham, ko’pincha muvaffaqiyatli Exit Code 0 (chiqish kodi 0) haqida xabar beradi.

Ushbu keng qamrovli qo’llanmada biz zaxira nusxalarining buzilishi anatomiyasini tahlil qilamiz, ma’lumotlar bazasiga xos tekshirish usullarini o’rganamiz va ishlab chiqarish muhitlari uchun avtomatlashtirilgan, o’q o’tkazmaydigan tiklash quvurlarini (pipelines) qanday qurishni ko’rsatamiz.

Zaxira nusxalarining buzilishi anatomiyasi

Buzilishni aniqlash uchun avvalo uning qanday sodir bo’lishini tushunishingiz kerak. Zaxira nusxalarining buzilishi odatda ikki toifaga bo’linadi: jismoniy (infratuzilma darajasida) va mantiqiy (dastur darajasida).

Jismoniy buzilish

Jismoniy buzilish saqlash muhitidagi haqiqiy bitlar o’zgarganda sodir bo’ladi. Bu manba diskidan o’qish jarayonida, tarmoq orqali uzatishda yoki maqsadli xotirada saqlanayotganda yuz berishi mumkin.
* Bitlarning chirishi (Bit Rot): Saqlash vositalarining asta-sekin yomonlashuvi bitlarni jimgina o’zgartirishi mumkin.
* Uzatish xatolari: TCP nazorat summalariga (checksums) ega bo’lsa-da, ular juda zaif (16-bit). Yuqori o’tkazuvchanlik muhitlari TCP aniqlay olmaydigan sim orqali ma’lumotlarning yashirin buzilishiga duch kelishi mumkin.
* Saqlash kontrolleri nosozliklari: RAID kontrollerlari yoki SAN matolaridagi apparat xatolari operatsion tizimga muvaffaqiyat haqida xabar berib, noto’g’ri ma’lumotlarni yozishi mumkin.

Mantiqiy buzilish

Mantiqiy buzilish ancha xavfliroq, chunki zaxira nusxasi faylining o’zi butunlay butun, lekin uning ichidagi ma’lumotlar buzilgan bo’ladi.
* Chiqindi kirsa, chiqindi chiqadi (GIGO): Agar sizning jonli ma’lumotlar bazangizda buzilgan indeks yoki yirtilgan sahifa bo’lsa, zaxira nusxalash vositangiz o’sha buzilgan sahifani sodiqlik bilan nusxalashi mumkin. Zaxira nusxalash vazifasi muvaffaqiyatli yakunlanadi, ammo tiklash muvaffaqiyatsiz bo’ladi yoki buzilgan ma’lumotlar bazasini beradi.
* Tugallanmagan tranzaksiyalar: Ma’lumotlar bazasi kiritish-chiqarish (I/O) jarayonini to’g’ri muzlatmasdan olingan fayl tizimi darajasidagi suratlar (masalan, MySQL-da FLUSH TABLES WITH READ LOCK dan foydalanmaslik) yirtilgan sahifalarga va tiklab bo’lmaydigan holatlarga olib keladi.

Proaktiv aniqlash: Nazorat summalari va kriptografik xeshlash

Jismoniy buzilishga qarshi birinchi himoya chizig’i kriptografik tekshiruvdir. Fayl o’lchamlari yoki o’zgartirilgan sanalariga tayanish yetarli emas.

Ma’lumotlar bazasi darajasidagi nazorat summalarini yoqish

Zamonaviy relyatsion ma’lumotlar bazasini boshqarish tizimlari (RDBMS) sahifa darajasidagi nazorat summalarini qo’llab-quvvatlaydi. Yoqilganda, ma’lumotlar bazasi har bir sahifani diskka yozishdan oldin uning nazorat summasini hisoblaydi. Sahifa o’qilganda (so’rov yoki zaxira jarayoni orqali), nazorat summasi tekshiriladi.

PostgreSQL uchun klaster ishga tushirilganda ma’lumotlar nazorat summalarini yoqishingiz mumkin:

# Nazorat summalari yoqilgan holda yangi PostgreSQL klasterini ishga tushirish
initdb --data-checksums -D /var/lib/postgresql/data

Eslatma: Agar sizda mavjud PostgreSQL klasteri bo’lsa, ularni oflayn rejimda yoqish uchun pg_checksums yordamchi dasturidan foydalanishingiz mumkin.

Microsoft SQL Server uchun PAGE_VERIFY CHECKSUM ga o’rnatilganligiga ishonch hosil qiling (zamonaviy versiyalarda standart, lekin eski tizimlarda tekshirishga arziydi):

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Saqlangan zaxira nusxalarini tekshirish

Zaxira nusxasi saqlash joyiga yetib kelgach, uning yaxlitligi kriptografik jihatdan tekshirilishi kerak. CloudSave kabi korporativ zaxira platformalari uzatish va saqlash vaqtida zaxira bloklarining SHA-256 xeshlarini avtomatik ravishda hisoblaydi va tekshiradi. Agar siz maxsus skriptlarni boshqarayotgan bo’lsangiz, buni qo’lda amalga oshirishingiz kerak:

# Zaxira nusxasi yaratilgandan so'ng SHA-256 xeshini yaratish
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Saqlash serverida xeshni tekshirish
sha256sum -c prod_db_backup.tar.gz.sha256

Ma’lumotlar bazasiga xos tekshirish usullari

Turli ma’lumotlar bazasi dvigatellari o’zlarining zaxira artefaktlari yaxlitligini tekshirish uchun mahalliy vositalarni taklif qiladi.

PostgreSQL: pg_verifybackup

PostgreSQL 13 da taqdim etilgan pg_verifybackup pg_basebackup bilan olingan jismoniy zaxira nusxalari uchun o’yin qoidalarini o’zgartiruvchi vositadir. U zaxira nusxalash vaqtida yaratilgan backup_manifest faylini o’qiydi va barcha fayllar mavjudligini hamda ularning nazorat summalari mos kelishini tekshiradi.

# Jismoniy bazaviy zaxira nusxasi katalogiga nisbatan tekshiruvni ishga tushirish
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Agar ma’lumotlar fayllarining birortasida bitta bit o’zgargan bo’lsa, pg_verifybackup fatal xatolikni yuzaga keltiradi, bu esa monitoring tizimlariga DBA jamoasini darhol ogohlantirish imkonini beradi.

Microsoft SQL Server: RESTORE VERIFYONLY

SQL Server zaxira faylini aslida tiklamasdan, uning jismoniy yaxlitligini tekshirish uchun mahalliy buyruqni taqdim etadi. U zaxira sarlavhalarini tekshiradi va sahifa nazorat summalarini (agar ular zaxira nusxalash vaqtida yoqilgan bo’lsa) tasdiqlaydi.

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

Ogohlantirish: RESTORE VERIFYONLY faqat zaxira fayli o’qilishi mumkinligini va jismoniy nazorat summalari mos kelishini tasdiqlaydi. U mantiqiy yaxlitlikka kafolat bermaydi. Mantiqiy yaxlitlikni ta’minlash uchun siz to’liq tiklashni amalga oshirishingiz va DBCC CHECKDB ni ishga tushirishingiz kerak.

MySQL / InnoDB: Percona XtraBackup

MySQL muhitlari uchun jismoniy zaxira nusxalari ko’pincha Percona XtraBackup tomonidan boshqariladi. Zaxira jarayoni fayllarni nusxalashdan iborat, ammo tranzaksiya jurnallari (redo logs) qo’llanilmaguncha zaxira nusxasi izchil bo’lmaydi. --prepare bosqichi o’rnatilgan yaxlitlik tekshiruvi vazifasini bajaradi.

# Zaxira nusxasini tayyorlash redo jurnallarini qo'llaydi. 
# Agar zaxira nusxasi buzilgan bo'lsa, bu bosqich muvaffaqiyatsiz bo'ladi.
xtrabackup --prepare --target-dir=/data/backups/mysql/

Oltin standart: Avtomatlashtirilgan tiklash sinovi

Nazorat summalari va tekshirish buyruqlari zarur, ammo ular yetarli emas. Zaxira nusxasi yaroqli ekanligini aniq isbotlashning yagona yo’li uni tiklashdir. Zamonaviy DevOps muhitlarida bu jarayon to’liq avtomatlashtirilgan bo’lishi kerak.

Zaxira nusxalariga kod sifatida munosabatda bo’lish orqali siz ma’lumotlar bazasini tiklash uchun CI/CD quvurini qurishingiz mumkin. Ushbu quvur vaqtinchalik infratuzilmani ta’minlashi, tiklashni amalga oshirishi, tekshirish so’rovlarini bajarishi va muhitni o’chirib tashlashi kerak.

Avtomatlashtirilgan tiklash quvurini qurish

Quyida PostgreSQL mantiqiy nusxasini tekshirish uchun cron vazifasi yoki CI runner (GitLab CI yoki GitHub Actions kabi) tomonidan har kuni ishga tushirilishi mumkin bo’lgan Bash skripti namunasi keltirilgan.

#!/bin/bash
set -e

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

echo "[INFO] Avtomatlashtirilgan tiklash sinovi boshlanmoqda..."

# 1. Vaqtinchalik PostgreSQL konteynerini ishga tushirish
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# PostgreSQL tayyor bo'lishini kutish
echo "[INFO] Ma'lumotlar bazasi ishga tushishini kutish..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Maqsadli ma'lumotlar bazasini yaratish
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Tiklashni amalga oshirish
echo "[INFO] Zaxira nusxasi tiklanmoqda..."
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. Mantiqiy tekshirish so'rovlarini bajarish
echo "[INFO] Tekshirish so'rovlari bajarilmoqda..."
# Foydalanuvchilar jadvalida 10 000 dan ortiq yozuv borligini tekshirish
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] Mantiqiy tekshirish muvaffaqiyatsiz bo'ldi. 10000 dan ortiq foydalanuvchi kutilgan edi, $USER_COUNT topildi"
    # Bu yerda PagerDuty / Slack ogohlantirishini ishga tushiring
    exit 1
else
    echo "[SUCCESS] Mantiqiy tekshirish muvaffaqiyatli o'tdi. Foydalanuvchilar soni: $USER_COUNT"
fi

# 5. Vaqtinchalik muhitni o'chirish
echo "[INFO] Tozalash ishlari..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Avtomatlashtirilgan tiklash sinovi muvaffaqiyatli yakunlandi."

Nimani tekshirish kerak?

Avtomatlashtirilgan tiklash sinovini o’tkazayotganda, faqat ma’lumotlar bazasi ishga tushishini tekshirmang. Dasturga xos tekshirish so’rovlarini bajaring:
1. Qatorlar soni: Asosiy jadvallarda kutilgan qatorlar soni borligiga ishonch hosil qiling (masalan, users jadvali bo’sh bo’lmasligi kerak).
2. Yaqin vaqtdagi ma’lumotlar: Zaxira nusxasi eskirib qolmaganligini tekshirish uchun oxirgi 24 soat ichida yaratilgan yozuvlarni so’rang.
3. Referensial yaxlitlik: Mantiqiy buzilishni ko’rsatadigan yetim qolgan tashqi kalitlarni (orphaned foreign keys) tekshirish uchun skriptlarni ishga tushiring.

Zaxira nusxasi anomaliyalari uchun monitoring va ogohlantirish

Halokat yuz bermasdan oldin buzilishni aniqlash kuchli kuzatuvchanlikni talab qiladi. Ikkilik muvaffaqiyat/muvaffaqiyatsizlik holatlaridan tashqari, anomaliyalarni aniqlash uchun zaxira nusxalash vazifalaringizning metama’lumotlarini kuzatishingiz kerak.

Evristik monitoring

Zaxira nusxalash metama’lumotlaringizni Prometheus-ga integratsiya qiling va uni Grafana bilan vizualizatsiya qiling. Quyidagi evristikalar uchun ogohlantirishlarni o’rnating:
* Hajmning keskin pasayishi: Agar sizning kundalik zaxira nusxangiz doimiy ravishda 500 GB bo’lsa va bugungi zaxira nusxasi 50 MB bo’lsa, vazifa muvaffaqiyatli yakunlangan bo’lishi mumkin (Exit Code 0), lekin u katta ehtimol bilan bo’sh sxemani zaxiralagan.
* Davomiylik anomaliyalari: Agar odatda 2 soat davom etadigan zaxira nusxasi 5 daqiqada tugasa, biror narsa o’tkazib yuborilgan. Aksincha, agar u 10 soat davom etsa, sizda buzilishga olib kelishi mumkin bo’lgan disk I/O yomonlashuvi bo’lishi mumkin.
* WAL/Arxiv jurnallarining to’planishi: Agar ma’lumotlar bazangiz Write-Ahead Logs (WAL) hosil qilsa, lekin zaxira tizimi ularni yetarlicha tez arxivlamasa, siz Point-in-Time Recovery (PITR) zanjiringizda uzilish xavfiga duch kelasiz.

Yaxlitlik tekshiruvlari bilan 3-2-1 qoidasini amalga oshirish

Sanoat standarti bo’lgan 3-2-1 zaxira qoidasi (ma’lumotlarning 3 ta nusxasi, 2 xil muhit, 1 ta ofisdan tashqarida) faqat barcha nusxalar tekshirilgan bo’lsagina samarali bo’ladi.

Bu yerda CloudSave kabi korporativ yechimdan foydalanish operatsion xarajatlarni keskin kamaytiradi. Har bir ma’lumotlar bazasi tuguni uchun murakkab bash skriptlarini yozish va saqlash o’rniga, CloudSave 3-2-1 hayotiy tsiklini avtomatlashtirish uchun infratuzilmangiz bilan bevosita integratsiyalanadi. U o’zgarmas xotirani ta’minlaydi — to’lov dasturlaridan (ransomware) himoya qiladi — va o’rnatilgan, avtomatlashtirilgan tiklashni tekshirish jadvallariga ega. CloudSave avtomatik ravishda izolyatsiya qilingan sandbox muhitlarini ishga tushirishi, zaxira nusxasini o’rnatishi, maxsus SQL tekshirish skriptlaringizni bajarishi va sog’liq holati haqida markaziy boshqaruv panelingizga hisobot berishi mumkin.

Xulosa

Buzilgan ma’lumotlar bazasi zaxira nusxalari biznesni yo’q qilishi mumkin bo’lgan yashirin qotildir. Zaxira skriptining Exit Code 0 holatiga faqat tayanish xavfli qimordir.

Ishlab chiqarish muhitlaringizni chinakam himoya qilish uchun siz chuqurlashtirilgan himoya strategiyasini qabul qilishingiz kerak:
1. Ma’lumotlar bazasi dvigatelingizda sahifa darajasidagi nazorat summalarini yoqing.
2. Zaxira nusxasi yaratilgandan so’ng darhol mahalliy tekshirish vositalaridan (pg_verifybackup, RESTORE VERIFYONLY) foydalaning.
3. Evristik anomaliyalar uchun zaxira metama’lumotlarini (hajmi, davomiyligi) kuzating.
4. Kundalik operatsion quvuringizning bir qismi sifatida avtomatlashtirilgan, vaqtinchalik tiklash sinovini amalga oshiring.

Passiv «ishga tushir va unut» zaxira mentalitetidan faol «uzluksiz tiklashni tekshirish» modeliga o’tish orqali siz halokat muqarrar ravishda yuz berganda ma’lumotlaringiz tayyor, ishonchli va to’liq tiklanishi mumkinligiga ishonch hosil qilasiz.