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.