Barcha kurslar Yo'nalishlar Reyting Kirish Ro'yxatdan o'tish

Bu modul bazaning ichki ishlashi haqida: ma’lumot diskda qanday joylashadi, katta natija qanday o’qiladi, bir vaqtda kelgan so’rovlar qanday muvofiqlashtiriladi va ma’lumot qanday himoyalanadi.

Row store va column store: kirish

Jadvalni biz qator va ustunlar to’ri sifatida tasavvur qilamiz, lekin diskda ma’lumot chiziqli — ketma-ket baytlar sifatida yoziladi. Uni yozishning ikki yo’li bor.

Row store (qator bo’yicha saqlash) — bitta qatorning barcha ustunlari yonma-yon yotadi:

[1, Aziz, 101, 85][2, Malika, 102, 92][3, Bobur, 101, 74]

Column store (ustun bo’yicha saqlash) — bitta ustunning barcha qiymatlari yonma-yon yotadi:

[1, 2, 3][Aziz, Malika, Bobur][101, 102, 101][85, 92, 74]

Ikkalasi ham bir xil ma’lumotni saqlaydi va bir xil SQL’ni tushunadi — farq faqat joylashuvda. Lekin aynan shu joylashuv tezlikni belgilaydi.

Row va column store: afzallik va kamchiliklar

Bitta talabaning butun kartochkasi kerak bo’lsa, row store yutadi: qator diskda bitta joyda yotadi, uni bir o’qishda olish mumkin. Butun jadval bo’yicha faqat bitta ustundan o’rtacha hisoblash kerak bo’lsa, column store yutadi: kerakli ustun ketma-ket yotgani uchun boshqa ustunlar umuman o’qilmaydi.

Xususiyat Row store Column store
Bitta qatorni to’liq o’qish Tez Sekin (ustunlar yig’iladi)
Bitta ustun bo’yicha hisoblash Sekin (butun jadval o’qiladi) Tez
Yozuv qo’shish va yangilash Tez Qimmatroq
Siqish (compression) O’rtacha Yuqori — qiymatlar bir xil turdagi
Mos vazifa Tranzaksion tizim (OLTP) Analitika va hisobot (OLAP)

Shu sababli bank yoki onlayn do’kon bazasi odatda row store (PostgreSQL, MySQL), hisobot va katta hajmli analitika esa column store (ClickHouse) ustida quriladi. Zamonaviy tizimlar ko’pincha ikkalasini birga ishlatadi: asosiy baza row store, undan nusxa ko’chirilgan analitik ombor column store.

Database cursor

Odatiy so’rovda baza natijaning hammasini bir yo’la tayyorlab beradi. Agar natijada millionlab qator bo’lsa, bu xotirani to’ldirib qo’yadi. Kursor (cursor) shu muammoni yechadi: u natijaga ko’rsatkich bo’lib, qatorlarni bo’lak-bo’lak o’qish imkonini beradi.

BEGIN;
DECLARE talaba_kursor CURSOR FOR SELECT ism, ball FROM talabalar ORDER BY id;
FETCH 2 FROM talaba_kursor;

Natija:

  ism   | ball
--------+------
 Aziz   |   85
 Malika |   92

Keyingi FETCH navbatdagi qatorlarni beradi, ish tugagach kursor CLOSE bilan yopiladi. Kursor ikki holatda foydali: juda katta natijani xotiraga sig’dirmasdan qayta ishlashda va har bir qator ustida alohida amal bajarish kerak bo’lganda. Uning narxi bor — qatorma-qator ishlash ommaviy so’rovdan sekinroq, shuning uchun oddiy vazifani kursorsiz, bitta SQL so’rovi bilan yechish afzal.

Parallel murojaatlar: muammo

Haqiqiy bazaga bir vaqtning o’zida ko’plab foydalanuvchi murojaat qiladi. Agar ikki so’rov bir xil ma’lumotni o’zgartirsa, natija ular qanday navbatlashganiga bog’lanib qoladi.

Klassik misol — hisobdagi 100 000 so’m:

Vaqt   A operatsiyasi              B operatsiyasi
1      Qoldiqni o'qidi: 100000
2                                  Qoldiqni o'qidi: 100000
3      50000 ayirdi -> 50000
4                                  30000 ayirdi -> 70000
5      Yozdi: 50000
6                                  Yozdi: 70000

Ikkala operatsiya ham bajarildi, lekin hisobda 20 000 emas, 70 000 qoldi — A ning natijasi yo’qoldi. Bu "yo’qolgan yangilanish" (lost update) deyiladi. Shunga o’xshash boshqa muammolar ham bor: hali tasdiqlanmagan ma’lumotni o’qish (dirty read) va ayni so’rovni ikki marta bajarganda turli natija olish (non-repeatable read).

Parallel murojaatlar: yechimlar

Bunday holatlarni bazaning o’zi boshqaradi — bu concurrency control deb ataladi. Asosiy vositalar:

  • Tranzaksiya — bir nechta amalni bitta bo’linmas blokka jamlash. Blok yo to’liq bajariladi, yo umuman bajarilmaydi.
  • Qulf (lock) — bir so’rov ma’lumot ustida ishlayotganda boshqasini kutishga majburlash.
  • Izolyatsiya darajasi — tranzaksiyalar bir-birini qanchalik "ko’rishini" belgilaydigan sozlama.
BEGIN;
UPDATE hisoblar SET qoldiq = qoldiq - 50000 WHERE id = 1;
UPDATE hisoblar SET qoldiq = qoldiq + 50000 WHERE id = 2;
COMMIT;

Bu yerda pul bir hisobdan yechilib, ikkinchisiga o’tkaziladi. Agar ikkinchi UPDATE xato bersa, ROLLBACK birinchisini ham bekor qiladi — pul yo’lda qolib ketmaydi. E’tibor bering, qoldiq qoldiq - 50000 ko’rinishida hisoblanmoqda: qiymat bazaning o’zida yangilanadi, dasturga o’qib olinib qaytarilmaydi — bu yuqoridagi lost update holatining oldini oladi.

Boshlovchilar odatda BEGIN yozib, COMMITni unutadi. Bunda o’zgarishlar boshqa foydalanuvchilarga ko’rinmaydi va tegilgan qatorlar qulflangan holda qolib, boshqa so’rovlarni kutishga majburlaydi.

Ma’lumotlar bazasi xavfsizligi

Baza xavfsizligi bir necha qatlamdan iborat va ularning har biri alohida ishlaydi:

Qatlam Nima qiladi
Autentifikatsiya Kim ulanayotganini aniqlaydi (parol, sertifikat)
Avtorizatsiya Kim nimaga huquqli ekanini belgilaydi
Tarmoq darajasi Bazaga faqat ishonchli manzillardan ulanishga ruxsat beradi
Shifrlash Ma’lumotni uzatishda va diskda o’qib bo’lmaydigan qiladi
Audit Kim, qachon, nima qilganini yozib boradi

Huquqlar GRANT va REVOKE bilan boshqariladi:

GRANT SELECT ON talabalar TO hisobotchi;

Bu buyruqdan keyin hisobotchi foydalanuvchisi jadvalni faqat o’qiy oladi — unga INSERT yoki DELETE ta’sir qilmaydi. Asosiy tamoyil — eng kam imtiyoz (least privilege): har bir foydalanuvchi va dastur o’z vazifasi uchun zarur bo’lgan minimal huquqni oladi. Veb-dastur bazaga administrator huquqi bilan ulanmasligi kerak.

Alohida xavf — SQL injection: foydalanuvchi kiritgan matnni to’g’ridan-to’g’ri so’rov satriga qo’shish. Himoya usuli oddiy — so’rovga qiymatlarni parametr sifatida uzatish, satrni yopishtirib yasamaslik.

Backup olish va uni tiklash

Zaxira nusxa (backup) — ma’lumotni yo’qotishdan himoya qiluvchi oxirgi chegara. Disk ishdan chiqishi, jadval xato o’chirilishi yoki server buzilishi mumkin; bu holatlarning barchasida yagona najot — yaqinda olingan nusxa.

pg_dump -U foydalanuvchi baza_nomi > zaxira.sql
psql -U foydalanuvchi baza_nomi < zaxira.sql

Birinchi buyruq bazaning butun holatini matnli faylga yozadi, ikkinchisi shu fayldan bazani qayta tiklaydi.

Amalda e’tiborga olinadigan uchta narsa bor. Birinchisi — muntazamlik: zaxira qo’lda emas, jadval bo’yicha avtomatik olinishi kerak. Ikkinchisi — joylashuv: nusxa baza turgan serverning o’zida yotsa, server yo’qolganda u ham yo’qoladi. Uchinchisi va eng ko’p e’tibordan chetda qoladigani — tiklashni sinab ko’rish: hech qachon tiklanmagan zaxira aslida zaxira emas, chunki uning ishlashiga ishonch yo’q.

Amaliyot

  1. Quyidagi vazifalarning har biri uchun row store yoki column store mosligini aniqlang: internet-do’kon buyurtmalari; bir yillik savdo bo’yicha oylik hisobot; foydalanuvchi profilini ochish.
  2. Kursor qaysi holatda kerak bo’ladi va qaysi holatda oddiy SELECT yetarli? Ikkita misol keltiring.
  3. Yuqoridagi hisob misolini qog’ozda qaytadan chizing va tranzaksiya ishlatilganda vaqt jadvali qanday o’zgarishini ko’rsating.
  4. Faqat hisobot o’qiydigan foydalanuvchi uchun kerakli GRANT so’rovlarini yozing va unga nima uchun DELETE huquqi berilmasligini tushuntiring.
  5. Kichik loyiha uchun zaxira rejasini tuzing: qanchalik tez-tez, qayerda saqlanadi va tiklash qanday tekshiriladi?

Yakuniy test bu modulning barcha mavzularini qamrab oladi.

Ichki mexanizmlar va xavfsizlik — konspekt

Ichki mexanizmlar va xavfsizlik Maqola

Row va column store farqi, kursorlar, parallel murojaatlar muammosi va yechimlari, ma’lumotlar bazasi xavfsizligi hamda backup — yakuniy modul konspekti.

Eslatma yozish uchun saytga kiring.

Resurslar hozircha qo'shilmagan

O'qituvchi dars uchun qo'shimcha materiallarni qo'shganida shu yerda paydo bo'ladi.

Savol berish uchun saytga kiring.

Hozircha savollar yo'q

Bu dars yuzasidan birinchi savolni siz bering.