CodeGym /Kurslar /SQL SELF /PostgreSQL-də məlumatlar necə saxlanılır: baza strukturu ...

PostgreSQL-də məlumatlar necə saxlanılır: baza strukturu və tranzaksiya jurnalı (WAL)

SQL SELF
Səviyyə , Dərs
Mövcuddur

Verilənlər bazası ilə işləyəndə hər şey çox sadə görünür: bir sətir əlavə etdin, yazını yenilədin, müştərini sildin. Amma bu sadəliyin arxasında mürəkkəb və düşünülmüş bir mexanizm var. Bəs bu məlumatlar əslində harada saxlanılır? PostgreSQL necə olur ki, server qəfil sönsə belə heç nə itirmir?

Bunu başa düşmək üçün iki əsas şeyi bilmək lazımdır: məlumatlar (cədvəllər, indekslər, xidməti info) fiziki olaraq harada yerləşir və bu məlumatların qorunması üçün hansı mexanizm işləyir — tranzaksiya jurnalı, yəni WAL (Write-Ahead Logging).

Bütün PostgreSQL bazası xüsusi bir qovluqda — data_directory — fayllar dəsti şəklində saxlanılır. Adətən bu qovluq belə olur:

/var/lib/postgresql/17/main

Bu qovluqda — bazanın ürəyi yerləşir: həm cədvəllər, həm indekslər, həm metainfo, həm də sazlamalar. Burada həmçinin WAL jurnalı var — bütün dəyişiklikləri ilk qəbul edən mexanizm. Məlumatlar diskin üzərində cədvələ düşməzdən əvvəl, onlar WAL-a yazılır. Bu, sanki qaralama kimidir, baza hər addımı ora qeyd edir ki, qəza olsa, sonuncu əməliyyata qədər hər şeyi bərpa etmək mümkün olsun.

Bu yanaşma sayəsində PostgreSQL hətta ən qeyri-sabit şəraitdə belə etibarlılıq və dayanıqlıq təmin edir.

Cədvəllər

Hər cədvəl — fiziki olaraq ayrı bir fayl və ya fayllar dəstidir. Bu fayllar base/ alt qovluğunda yerləşir. Struktur təxminən belədir:

$PGDATA/base/
├── 16384/
│   ├── 12345   ← cədvəl
│   ├── 12346   ← indeks
│   └── ...
  • 16384 — bazanın daxili identifikatoru (OID).
  • 12345 — konkret cədvəlin identifikatoru.

Cədvəl böyükdürsə, PostgreSQL onu 1 GB-lıq seqmentlərə bölür:

12345
12345.1
12345.2
...

Fayllarda "sətirlər" CSV-dəki kimi deyil — burada 8 KB-lıq "binary page" formatı var.

WAL: Write-Ahead Logging — sadəcə "log" deyil

İndi isə PostgreSQL-in ən vacib və tez-tez səhv başa düşülən hissəsinə keçirik — WAL, yəni Write-Ahead Logging. Adında log sözü olsa da, WAL adi text log-faylı deyil, məsələn, error log-ları və ya query log-ları kimi. Bu, məlumatların tutarlılığı və bərpası üçün həyati vacib mexanizmdir və fayl sistemində aşağı səviyyədə dəyişiklikləri izləyir.

WAL — hadisələrin hesabatı deyil, PostgreSQL-in məlumatlarda edəcəyi bütün dəyişikliklərin qabaqcadan yazılmasıdır. Bu yazı cədvəllərdə real dəyişiklik olmamışdan əvvəl baş verir. Buna görə də write-ahead — "əvvəlcədən yazmaq" adlanır.

Məsələn, yeni sətir əlavə edəndə PostgreSQL:

  1. Cədvəli dərhal diskdə yeniləmir — bu həm yavaş, həm də təhlükəli olardı.
  2. Əvvəlcə WAL-a yazır ki, bu sətir əlavə olunacaq.
  3. Yalnız sonra, məsələn, background prosesində, məlumatlar həqiqətən cədvələ düşür.

Bu, bankda çek kimi işləyir: əvvəlcə çeki imzalayırsan (WAL), sonra bank hesabı yeniləyir (cədvəl). Nəsə alınmasa — çek hələ də səndədir və əməliyyatı təkrarlamaq olar.

WAL formatı və strukturu

  • WAL-fayllar binary formatda saxlanılır.
  • Hər fayl dəqiq ardıcıllıqla əməliyyatlar axınıdır, burada məlumat səhifələrinin, indeks strukturlarının, commit-lərin və s. dəyişiklikləri təsvir olunur.
  • Bir WAL-faylının ölçüsü sabitdir — default olaraq 16 MB.

Vacibdir: WAL-da "SQL-komandalar" və ya "cədvəl sətirləri" adi formada yoxdur. Orada PostgreSQL engine üçün təlimatlar var ki, dəyişiklikləri səhifə-səhifə necə bərpa etmək lazımdır.

Qəza baş verəndə nə olur?

Əgər PostgreSQL serveri qəfil sönsə — məsələn, elektrik birdən getsə — heç nə itmir. Növbəti işə salmada baza panik etmir, sadəcə diskdən son saxlanmış "dayanıqlı" məlumat versiyasını yükləyir. Sonra tranzaksiya jurnalını (WAL) götürür, orada qalan son dəyişiklikləri tapır və onları ehtiyatla tətbiq edir — əsas fayllara düşməyənləri tamamlayır. Nəticədə baza tam tutarlı vəziyyətə bərpa olunur, sanki heç nə olmamış kimi.

WAL-ın əlavə imkanları

Point-In-Time Recovery (PITR). WAL-faylları saxlamaq bazanı istənilən zamana iki tam backup arasında bərpa etməyə imkan verir.

Streaming replication. PostgreSQL WAL-yazıları real vaxtda başqa serverə ötürə bilər. Bu, hot replica — əsas baza ilə sinxronizasiya olunan nüsxə saxlamağa imkan verir.

İncremental recovery. Tam backup ilə birlikdə WAL yalnız dəyişiklikləri bərpa etməyə imkan verir, bütün bazanı yenidən kopyalamağa ehtiyac yoxdur.

Binary backup-ların yaradılması: pg_basebackup

Əgər artıq pg_dump ilə bir az tanışsan, bilirsən ki, o, logical backup-lar (yəni bazanın strukturu və məlumatlarını SQL-sorğular şəklində kopyalamaq) üçün əladır. Bəs fiziki backup lazımdırsa? Məsələn, bütün baza fayllarının tam mirror surətini çıxarmaq istəyirsən? Burada pg_basebackup köməyə gəlir.

pg_basebackup — PostgreSQL məlumatlarının fiziki surətini çıxarmağa imkan verən utilitdir. Xüsusilə böyük bazalar üçün bərpa prosesini effektiv idarə etmək üçün faydalıdır. Əsas üstünlüyü — pg_basebackup bunu çox sürətli edir.

pg_basebackup komandasının əsas sintaksisi

pg_basebackup ilə işləmək üçün əvvəlcə komandanı başa düşmək lazımdır. Terminalda belə yazılır:

pg_basebackup -D /backup_directory -F tar -z -P

Burada nə baş verir, izah edək:

  • -D /backup_directory — backup fayllarının saxlanacağı qovluğu göstərir.
  • -F tar — məlumat formatı. tar seçimi .tar arxiv faylı yaradır. plain istifadə etsən, baza fayl strukturu yaradılır.
  • -z — backup-u sıxır, bu da diskdə yerə qənaət edir. Backup az yer tutanda həmişə xoş olur!
  • -P — real vaxtda prosesin gedişatını göstərir. Bu, əlavə rahatlıq verir: görürsən ki, proses gedir və server "donmayıb".

İstifadə nümunəsi:

pg_basebackup -D /backups/university_backup -F tar -z -P

Komanda icra olunandan sonra /backups/university_backup qovluğunda .tar formatında backup yaranır.

pg_basebackup istifadə etməyin üstünlükləri

Effektivlik: incremental backup-lar dəyişməyən məlumatları təkrar kopyalamır, həm vaxt, həm də yerə qənaət edir.

Sadəlik: pg_basebackup aləti bütün detalları, o cümlədən WAL-faylları avtomatik idarə edir.

Etibarlılıq: PostgreSQL mexanikası ilə inteqrasiya sayəsində pg_basebackup bazanın tam dəqiq surətini yaradır və onu asanlıqla bərpa etmək olur.

İstifadə nümunələri

İndi isə praktikaya keçək. Aşağıda PostgreSQL bazasının backup-unun yaradılması üçün pg_basebackup istifadə nümunələri var. Göstərəcəyik ki, necə əsas backup etmək, sıxmanı əlavə etmək və tranzaksiya jurnalının (WAL) arxivləşdirilməsini qoşmaq olar ki, "istənilən zamana" bərpa mümkün olsun. Bu komandalar həm yeni başlayanlar, həm də qabaqcıl ssenarilər üçün uyğundur.

Əsas backup-un yaradılması

pg_basebackup -D /backups/full_backup -F tar -z -P

Nəticə: .tar arxivində tam baza backup-u.

Sıxma və formatın tənzimlənməsi

Məlumatların yüksək sıxma səviyyəsi ilə backup yaradaq:

pg_basebackup -D /backups/full_backup -F tar -z -Z 9 -P

Burada -Z 9 sıxma səviyyəsini göstərir (maksimum — 9).

WAL arxivləşdirmə

Əgər WAL arxivləşdirmə sazlanıbsa, baza istənilən zamana bərpa oluna bilər. WAL backup üçün komanda:

pg_basebackup -D /backups/incremental_backup -F tar -z -P --wal-method=archive
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Backup-a giriş
Backup-a giriş
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION