CodeGym /Kurslar /SQL SELF /Məlumatların bərpasında problemlər və səhvlər

Məlumatların bərpasında problemlər və səhvlər

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

Elə bil backup — yağışlı gündə çətir kimidir: düşünürsən ki, səni bütün problemlərdən qoruyacaq. Amma əgər o çətirdə dəlik varsa, yenə də islanacaqsan. Backup və bərpa ilə də eyni vəziyyətdir: nəsə düz getməsə, məlumatları itirə bilərsən və ya daha pis, korlanmış database əldə edə bilərsən. Ona görə də səhvləri başa düşmək və onların qarşısını almaq çox vacibdir.

Məlumatların bərpasında problemlər

  1. PostgreSQL versiyalarının uyğun olmaması

Ən çox rast gəlinən və xoş olmayan problemlərdən biri — bir versiyada yaradılmış məlumatları başqa versiyada bərpa etməyə çalışmaqdır (məsələn, 11 versiyadan backup-ı 15 versiyaya bərpa etmək). PostgreSQL versiyalar arasında geriyə uyğunluğu zəmanət vermir.

Bu niyə baş verir?

  • Məlumat formatı versiyalar arasında dəyişə bilər.
  • Bəzi funksiyalar və parametrlər silinə və ya dəyişilə bilər.

Necə qarşısını almaq olar?

  • Backup-ları həmişə pg_dump ilə yaradın, PostgreSQL-in data qovluğunu birbaşa kopyalamaq əvəzinə. pg_dump universal SQL-skriptlər yaradır, onları istənilən uyğun versiyada bərpa etmək olur.
  • Bərpaya başlamazdan əvvəl versiyaların uyğunluğunu yoxlayın. Məlumatı PostgreSQL-in rəsmi sənədlərində tapa bilərsiniz.

Bir nümunə göstərək. Siz PostgreSQL 14 ilə backup yaratdınız:

pg_dump -U user -d my_database -f backup.sql

İndi onu PostgreSQL 15-də bərpa etməyə çalışırsınız:

psql -U user -d my_database -f backup.sql

Və belə bir səhv alırsınız:

ERROR:  tanınmayan konfiqurasiya parametri "old_function"

Həll: Serverdə PostgreSQL versiyasını yeniləyin və ya pg_upgrade utilitindən istifadə edin.

  1. Lazımi WAL-faylların olmaması

Bəzən inkremental və ya differensial backup-dan bərpa zamanı proses qəfil dayanır — səbəb isə çatışmayan WAL-fayllardır (Write-Ahead Logging). PostgreSQL onlara əsaslanır ki, son tam backup-dan sonra olan dəyişiklikləri "tamamlaya" bilsin. Əgər bu fayllar yoxdursa və ya korlanıbsa, database bərpanı bitirə bilməyəcək.

Bu, məsələn, WAL-faylların arxivləşdirilməsi aktiv edilməyəndə və ya kimsə yer boşaltmaq üçün qovluğu siləndə baş verir. Əgər natamam backup-lardan istifadə etməyi planlaşdırırsınızsa, postgresql.conf-da arxivləşdirməni aktiv edin:

archive_mode = on
archive_command = 'cp %p /path/to/wal_archive/%f'

Və mütəmadi olaraq yoxlayın ki, arxiv həqiqətən işləyir və fayllar oradadır və salamatdır. Bu, bərpanın sizi yarı yolda qoymayacağına əmin olmaq üçün kiçik bir qiymətdir.

  1. Backup faylının korlanması

Backup faylınız korlanmış ola bilər və bu, onu bərpa üçün yararsız edir.

Bu niyə baş verir?

  • Faylın ötürülməsi və ya saxlanması zamanı bütövlüyün pozulması.
  • Backup yaradılması zamanı gözlənilməz nasazlıq.

Necə qarşısını almaq olar?

Backup faylının bütövlüyünü yoxlamaq üçün sıxılma və checksum istifadə edin. Məsələn, fayl yaradıldıqdan sonra MD5-hash yaradın:

md5sum backup.sql > backup.sql.md5

Bərpadan əvvəl backup faylını yoxlayın:

md5sum -c backup.sql.md5

Problem və onun həlli

Korlanmış faylı bərpa etməyə çalışırsınız:

pg_restore -U user -d my_database backup.dump

Və görürsünüz:

pg_restore: fatal error: input file görünür text fayldır, amma siz 'pg_restore' komanda-line utilitindən istifadə edirsiniz; əvəzinə psql istifadə edin

Həll: Faylı text redaktorunda açıb yoxlayın, salamatdırmı. Əgər zədə azdırsa, SQL-faylı əl ilə düzəldə bilərsiniz.

  1. İstifadəçi hüquqlarının kifayət olmaması.

Bəzən bərpa zamanı hüquqların kifayət olmaması səbəbindən səhvlərlə qarşılaşa bilərsiniz, xüsusən də məhdud istifadəçi ilə bərpa edirsinizsə.

Bu niyə baş verir?

İstifadəçinin cədvəl, sxem və ya database obyektləri yaratmaq üçün kifayət qədər hüququ yoxdur.

Necə qarşısını almaq olar?

Bərpanı lazımi hüquqlara malik istifadəçi ilə edin:

pg_restore -U postgres -d my_database backup.dump
  1. Mövcud database-in üzərinə yazmaq

Daha bir tipik səhv — backup-dan database-i bərpa edəndə artıq orada məlumatlar varsa. Əgər təsadüfən mövcud yazıları "silirsinizsə", onları geri qaytarmaq mümkün olmayacaq.

Bu niyə baş verir?

--clean flag-ından istifadə etmirsiniz, nəticədə yeni backup köhnə məlumatların üzərinə yazılır.

Necə qarşısını almaq olar?

Bərpa zamanı --clean flag-ından istifadə edin ki, mövcud strukturu siləsiniz:

pg_restore --clean -U user -d my_database backup.dump
  1. Bitməmiş tranzaksiya səhvi

Bərpa zamanı bitməmiş tranzaksiyada ilişib qalan məlumatlarla bağlı problemlər ola bilər. Bu, xüsusilə böyük database-lər üçün aktualdır.

Bu niyə baş verir?

Tranzaksiya serverin nasazlığı səbəbindən "korlanıb".

Necə qarşısını almaq olar?

Əmin olun ki, PostgreSQL serveri bütün təmiz tranzaksiyaları bərpadan əvvəl tamamlayır. Problem yaranarsa, serveri belə restart edin:

sudo service postgresql restart

Bərpa səhvlərinin qarşısını alma yolları

Konkret problemlərin qarşısını necə almaqdan danışdıq, amma elə ümumi strategiyalar da var ki, onların çoxunu önləməyə kömək edəcək:

Bərpanı mütəmadi test edin. Ayrı test database yaradıb ora məlumatları bərpa edin.

Bir neçə backup nüsxəsi saxlayın. Cloud servis, lokal storage və uzaq server istifadə edin.

Backup yaratmağı avtomatlaşdırın. cron və ya oxşar alətlərdən istifadə edib cədvəl qurun.

Faylların bütövlüyünü yoxlayın. Backup-ın korlanmadığına əmin olmaq üçün checksum istifadə edin.

PostgreSQL versiyalarının sinxronizasiyasını qoruyun. PostgreSQL yeniləmələrini heç vaxt təxirə salmayın, çünki gələcəkdə uyğunsuzluqlara səbəb ola bilər.

Real case-lər və onların həlləri

Case 1: WAL-faylların itməsi. Serveriniz gözlənilmədən sönür və görürsünüz ki, lazımi WAL-fayllar yoxdur. Bu halda tam database backup-ı olmadan bərpa mümkün deyil. Ən sadə həll — WAL arxivləşdirmə konfiqurasiyasını mütəmadi yoxlayın.

Case 2: Korlanmış backup. Backup-ı serverə yüklədiniz, amma yoxlayanda faylın boş olduğunu gördünüz. Belə hallarda başqa storage-dan backup istifadə edin və ya qismən korlanmış nüsxədən bərpa imkanını yoxlayın.

Case 3: Versiyaların uyğun olmaması. PostgreSQL 12-dən PostgreSQL 14-ə məlumat köçürəndə səhvlərlə rastlaşdınız. Məlumatları pg_dump ilə çıxarın və yeni versiyada bərpa edin.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION