Selamlar arkadaşlar PostgreSql Pg_Repack yazıma hoşgeldiniz. Bu yazımda size bu araçın nasıl kullanıldığı hakkında bilgiler vereceğim.
Nedir bu Pg_Repack?
Vacuum ve Cluster vb. gibi araçları kullanırken sisteminizde Lock‘lar oluşacak ve Database‘iniz geçici süre olsada duracaktır. Bu Lock süreleri yaptığınız işlemlere bağlı olarak uzayabilmektedir. Bu süre içerisinde DB‘nizi minimim kesintilerle devam ettirmenizi sağlayan araçtır pg_repack.
Nasıl çalışır?
Pg_Repack bu kesintileri engellemek ve Insert, Delete ve Update gibi işlemlerinizin durmaması adına Sanal Tablo oluşturur. İşlemin yapıldığı Lock‘lanmış tabloya gelen bu istekler oluşturulan yeni tabloya aktarılır. Eski tabloya eklenecek olan bu datalar için, eski tablonun tüm alanlarını oluşturulan yeni tabloda da yaratır indexleride dahil. Buda cihazınızda x2 tablo boyutu olarak yansıyacakdır. Bu işleme başlamadan önce yeterince alan olduğundan emin olun. İşlemler bittikten sonra tablolar birleştirilerek Lock‘lama kesintisi en aza indirilmiş olarak işlemler tamamlanır.
Neden ihtiyaç duyuyoruz peki Pg_Repack’e?
PostgreSql‘de tablolarda işlemler yaptığınızda Delete, Update gibi bu yapılan silme ve güncelleme işlemi sonrasında tablomuz üzerinde ölü alanlar (dead-tuple) alanlar bırakmaktadır ve tablonuzda ne kadar çok silme ve güncelleme işlemi yapılırsa bu alanlar DB‘nizi şişirmeye (Bloat) ve HDD‘nizde bulunan alanları bitirmeye başlayacaktır. Bu alanlar da kullanabilmek için Full Vacuum çalıştırmanız ve ölü alanlardı HDD‘nize tekrar kazandırmanız gerekir. Bu işlem sırasında da Lock oluşacak ve yukarıda da bahsettiğim gibi DB‘niz duracaktır. Bunu engellemek ve DB‘nin kesintisiz devam etmesiniz amaçlamaktadır bu aracımız.
Delete ve Update işlemleri neden yer kaybına neden olur?
Update işlemi yapıldığında aslında yeni kayıt Insert olarak eklenmektedir. Bundan dolayı yeni alan eklendiğinde eski alan silinmiş olarak işaretlenecektir. Aynı şekilde Delete işlemi yapıldığında da alan silinmez, sadece silinmiş olarak işaretlenecektir. Bundan dolayı Dead-Tuple alanlar oluşacaktır.
Dead-Tuple’ları kurtarma yolu Vacuum’dur!
Vacuum işlemini başlattığınızda ise Table‘ınızı satır satır tarayacak ve bulduğu ölü alanları FreeSpaceMap (FSM) olarak işaretleyecek ve kullanılmasını sağlayacaktır.
Kurulum adımları için gerekli olanlar :
İlk olarak Ubuntu 20.04 üzerinde çalışacağımı belirtmek isterim. Tüm Update ve Upgrade işlemleri yapılmış bir cihaz. PostgreSql 13 yüklenmiştir. Bu DB içerisinde Pg_Repack‘i uygulamak adına testdb oluşturulmuştur. Sizinde aynı şekilde cihazınızı hazırlamanızı rica ederim.
PostgreSql Kurulumu için Buraya tıklayarak yazıma ulaşabilirsiniz ya da Youtube üzerinden videomu izleyebilirsiniz.
Pg_Repack Kurulum Adımları :
> apt install postgresql-13-repack
// Kodu yardımıyla kuruluma başlıyoruz ve tamamlanıyor.
NOT : Kodları kopyala yapıştır ile alamıyorsanız elle yazın arkadaşlar bazen yazılarımda bu oluyor maalesef fark ettikce düzeltmeye çalışıyorum.
> pg_repack --version
// Kodu ile versiyon bilgisi alabilirsiniz.
> pg_repack --help
// Kodu ile ise kullanabileceğiniz kodları görebilirsiniz.
> nano /etc/postgresql/13/main/postgresql.conf
// Kodu ile postgresql.conf dosyasına gitmeli ve shared_preload_libraries alanına pg_repack yazmalı ve postgreye programı bildirmelisiniz.
> systemctl restart postgresql
// Tabi ki ayarlamaların aktif olması için daha sonra PostgreSql‘e Restart atmalısınız.
Daha sonra sırası ile aşağıdaki kodları yazıp testdb‘ye bağlanıyoruz.
> su - postgres
> psql testdb
// DB‘mize bağlandık.
> CREATE EXTENSION pg_repack;
// Extension oluşturuyoruz bu kod ile.
> \dx
// Kodu ile Extension kontrolleri sağlıyoruz.
DB içerisinde ölü alanlar oluşturmak için yaptığım işlemler :
testdb‘mize bağlanıyoruz.
> CREATE TABLE testtable (id SERIAL PRIMARY KEY,no int,name text,created_at TIMESTAMPTZ DEFAULT Now());
// Kodu yardımıyla testtable adında Table oluşturdum.
> insert into testtable (no,name) values (01,'semih');
// Kodu yardımıyla 01'den 05'e kadar elle datalar girdirdim.
> INSERT INTO testtable (no, name) SELECT no, name FROM testtable;
> insert into testtable select * from testtable;
// Kodu yardımıyla girdiğim data kadar kayıtların aynısını girmesi için bu komutu çalıştırdım ve neredeyse 200bin kayıt olana kadar sürekli bu komutu çalıştırdım.
> update testtable set name ='sistemdostu' where no=1;
// Sonra no=1'e eşit olan satırlardaki name alanını sistemdostu yazacak şekilde güncelleme işlemi yaptım ve elimde baya ölü alan olacak şekilde verileri güncelledim.
Dead-Tuble (Ölü alan) kontrolü yapabilmek için adımlar :
Şimdi bunun için yukarıdaki kodlar yardımı ile tekrar testvis adında bir tablo oluşturacağım. Aynı adımlar için içerisine birden fazla kayıt gireceğim. Yukarıdaki kodları kullanarak bunu sizde yapın.
> CREATE EXTENSION pg_visibility;
// Komutu yardımı ile visibility extension‘ı ekleyin.
> CREATE TABLE testvis (id SERIAL PRIMARY KEY, id1 int, id2 int);
> INSERT INTO testvis VALUES(generate_series(1,1000000), generate_series(1,1000000));
Kodlarımın yardımıyla Testvis adında bir tablo oluşturdum ve bu tablolara manuel olarak 1milyon adet kayıt eklettirdim.
> select count(blkno), all_visible from pg_visibility_map('testvis') group by all_visible;
// Komutu yardımıyla şuana herhangi bir ölü alan olmadığını gördüm.
Şimdi tablomuzda güncelleme sağlayacak ve daha sonra değişmeyen kayıtların t ile, Dead-Tuble alanların ise f ile işaretlendiğini göreceğiz bu sayede kontrollerimizi yapmış olacağız.
> UPDATE testvis set id = id + 1 where id > 50000;
// Kodu yardımıyla gerekli güncellemeleri yaptım ardından tekrar Visible alanları görmek istediğimde ise f alanları yanı Dead-Tuble alanlarıda görmüş oldum.
Bu alanların hepsini düzeltmek istiyorsanız ise;
> VACUUM testvis;
// Komutumuz ile Vacuum işlemi yapabilir ve tekrar satırları kullanılabilir hale getirebilirsiniz.
NOT : Bu makelede Visible alanlarını öğrenmemi sağlayan site ise Gökhan Ayrancıoğlu‘nun sitesidir. Buraya tıklayarak ayrıntılı bilgileri alabilirsiniz.
Bir Table’da pg_repack çalıştırmak için gerekli ayarları sağlayalım :
İlk olarak önemle söylemem gerek ki, pg_repack‘i çalıştırmak istiyorsanız tablonuzda oluştururken kesinlikle primary-key ya da not-null uniq key alanları olmalıdır. Bu şekilde oluşturun tablonuzu ve data girişi sağlayın.
– Tablo oluşturma ve data girişleri için aşağıdaki kodları kullanabilirsiniz :
> create table testtable (pid serial primary key, id int, last_name varchar(50));
> insert into testtable (id , last_name) SELECT i,MD5(random()::text) from generate_series(1, 1000000) s(i);
> update testtable set id = id + 1;
// Komutu yardımıyla gerekli güncellemeyi yapın ve ölü alanlar oluşsun.
> select count(blkno), all_visible from pg_visibility_map('testtable') group by all_visible;
// Daha sonra komutumuz ile bu alanları kontrol edin.
> pg_repack -d testdb --table testtable
// Komutumuzu Postgres kullanıcısına geçerek çalıştırın ve Vacuum işlemi yapmasını sağlayın. Bu komut çalışırken biraz beklemeniz lazım tabi ki tekrar alanlar t‘ya dönsün. Tabi ki bu işlem yapılırken tablo Lock‘lanmadığını da unutmayın.
Örnek Kodlar :
> pg_repack --dry-run -d testdb --table public.testtable
> pg_repack --all
> pg_repack -d testdb
> pg_repack -d testdb --schema public
İşlemler bu kadar arkadaşlar umarım yazım yararlı olur sizler için. Sorularınız ve önerileriniz olursa lütfen yorum kısmından bana iletin.
Herkese kolaylıklar diliyorum.