pg_squeeze
Pg_squeeze cybertec tarafından geliştirilmiş açık kaynak kodlu vacuum alternatfilerinden birisidir.
Pg_squeeze, 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_squeeze 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_squeeze 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_squeeze diğer vacuum alternatiflerinden farklı olarak postgresql içerisinde ki functionlar ile tetiklenebilmektedir.
Kurulum için ilk olarak aşağıdaki şekilde dosyayı indiriyoruz.
git clone https://github.com/cybertec-postgresql/pg_squeeze.git
İndirdiğiniz dizin içerisinde ki pg_squeeze dosyasının içerisine girerek aşağıdaki komutları sırayla çalıştırıyoruz.
Make
Make install
Yukarıdaki komutları çalıştırdıktan sonra aşağıdaki gibi postgresql.conf üzerinden değişiklikleri yapmamız gerekiyor.
wal_level = logical
max_replication_slots = 1
shared_preload_libraries = 'pg_squeeze'
Yukarıdaki parametreleri değiştirdikten sonra servisi aşağdaki şekilde restart ediyoruz
Systemctl status postgresql-13
Servisimizi restart ettikten sonra çalışma yapılacak veritabanına bağlanarak extension’ı oluşturuyoruz.
Create extension pg_squeeze;
Extension oluşturulduktan sonra aşağıdaki gibi tabloda vacuum işlemi yapabilirsiniz.
SELECT squeeze.squeeze_table('public', 'indextabled1', null, null, null);
Otomatik vacuum işlemi için aşağıdaki parametreleri postgresql.conf a ekleyerek faydalanabilirsiniz.
squeeze.worker_autostart = 'işlemyapılmakistenen veritabanı'
squeeze.worker_role = postgres
Yukarıdaki işlemler yapıldıktan sonra aşağıdaki gibi autovacuumu başlatabilirsiniz.
SELECT squeeze.start_worker();
Yukarıdaki parametre ile background worker parametresinde belirtilen parametre ile belirli periyodlar da vacuum işlemi yapılır.
Aşağıdaki parametre yardımı ile autovacuumu kapatabilirsiniz.
SELECT squeeze.stop_worker();