pg_repack Nedir?Nasıl kullanılır?

Pg_repack, postgresql içerisinde bulunan vacuum full ve cluster gibi araçlar kullanılırken sistemde uzun süreli locklara neden olduğundan dolayı geliştirilen bir araçtır.

Pg_reorg 2011 yılında geliştirilmesinin durdurulmasından dolayı pg_repack ,pg_reorg ‘ın bir alt dolu  olarak devam etmektedir.

Postgresql de ki vacuum full ve cluster gibi locka neden olan araçlardan kaçınmak ve süreleri minimum kesintiyle devam ettirmek adına en çok kullanılan paketlerden birisidir.

Pg_repack bir tabloda çalıştırıldığında işlem yapılan tabloda işlem sırasında gelecek olan insert,update ve delete gibi işlemler için bir tablo oluşturur.  Orijinal tabloda bir  trigger oluşturarak bu oluşturulan tabloya işlem sırasında gelen insert,update,delete işlemlerini yazar. Bu sayede pg_repack komutu çalıştırıldığında ilgili tabloda lock’ın önüne geçilmiş olur fakat bunla bitmez sadece eski tablodaki tüm sütunları ve dataları içeren yeni bir tablo oluşturulur ve eski tabloda ki indekslerde  oluşturulur.  Yeni tablo index ve dataları ile beraber oluşturulduktan sonra işlem sırasında gelen insert,update,delete  işlemlerinin tutulduğu tablo yeni tablo ile birleştirilerek işlem tamamlanır . Sistem tabloları ve viewleri de kullanılarak gerekli kontroller tamamlandıktan sonra   eski tablo silinerek yeni tablo rename yapılır ve işlem en az lock ile tamamlanmış olur.

Pg_repack çalıştırırken database bazlı, tablo bazlı ya da şema bazlı yapabiliriz ya da tablo yeniden oluşturulurken indexe göre değil şu sıraya göre oluştur diyebiliriz ya da yeniden düzenlenen tabloyu şu tablespace de oluştur diyebiliriz.  Pg_repack’in genel kullanımı aşağıdaki gibidir.

Pg_repack veritabanı bağlantıları için gerekli parametreler.

-d veya –dbname

İşlem yapmak istenen veritabanı

-h veya –host

İşlem yapmak istenen postgresql ip

-p veya –port

İşlem yapmak istenen postgresql portu

-w veya –no-password

PostgreSQL şifresiz bağlantı için

Postgresql kullanıcısının şifresini girmek için

-W veya –password

Pg_repack  parametrelerini bazıları aşağıdaki gibidir.

-a veya –all

Tüm veritabanlarında işlem yapmak için

-t veya –table=tablo_adi

sadece belirtilen tablo da işlem yapmak için

-I veya –parent-table=tablo_adi

İnherity tablolar için inherity detaylı bilgi için inherity table isimli yazımı okuyabilirsiniz.

-c veya –schema =şema_adi

Sadece belirtilen şema içerisindeki tablolar için

-s veya –tablespace=tablespace_adi

Yeniden paketlenecek tablolar için farklı bir tablespace alanı belirtmek için kullanılır.

-o veya –order-by= kolonadi

İndexlere göre sıralamak yerine belirtilen alana göre sıralama yapmak için kullanılır.

-n veya –no-order

VACUUM FULL yapmak için

-j veya –jobs= paralelillik_sayisi

Pg_repack işlemlerinin parallel sayısının belirtildiği yer.

-i  veya –index =index_adi

Belirtilen indexte pg_repack işlemi yapmak için

-x veya –only-indexes

Belirtilen tabloda işlem yapmak için

-T veya –wait–timeout=saniye

Çakışan işleri iptal etmek için kaç saniye bekleyeceği

-D veya –no-kill-backend

Timeout aldığında diğer işlemlerin iptal edilmemesi için gerekli parametre

-Z veya –no-kill-backend

İşlem sonunda analyze çalıştırmamak için

-k veya –no-superuser-check

Superuser kullanıcı denetimini geçmek için

 

-C veya –exclude-extension

Extension olan tablolarda işlem yapmak için

 

 

 

Postgresql13 üzerinden pg_repack’i yüklemek için aşağıdaki komuttan faydalanabilirsiniz.

 

yum install pg_repack13

 

 

Paketi yükledikten sonra aşağıdaki şekilde parametreler vererek çalıştırabilirsiniz.

 

 

/usr/pgsql-13/bin/pg_repack -d vacumdeneme -t indextabled1

 

 

Yukarıdaki gibi tablolarda tek tek işlem yapılabilir ya da screen veya crontab gibi paketleri yükleyerek günün belirli zamanlarında çalıştırabilirsiniz.

Loading