Aptronim Sahibinin Sayfası

2014/4/17 - 2 dakikada okunur - Yorumlar - Kompütür

git ve postgresql yedekleri

Yakın bir zamanda, postgresql yedeklerini versiyonlamak gibi bir cinlik aklıma geldi. Maksat, son yedeğin yanısıra eski yedekleri de tutmak ve mümkün olduğunca az yer kaplamalarını sağlamak. Bir süredir işler RCS kullanarak gayet iyi gidiyordu. Fakat tablolar ve içlerindeki veriler büyüdükçe, önce yavaşlama, sonra da “hafıza bitti” hataları gelmeye başladı. RCS‘in dosya farklarını saklamak için kullandığı diff, postgresql‘in pg_dump komutundan gelen toplu insert işlemlerini incelerken 2gb hafızalı VPS’te yetersiz kalıyordu.

Dinozorluğa artık gerek olmadığını, RCS yerine git kullanırsam sorunun tamamen çözüleceğini düşünerek, git‘e geçtim. Ama iki aracın üretim tarihleri arasında yıllar da olsa (RCS ilk olarak 1982’de, Git ise 2005’te kaleme alınmış) tasarımları arasında bir fark yokmuş: İkisi de performans için hafızayı kullanıyorlar, bundan dolayı binary olmayan ama değişiklik bloklarının çok büyük olduğu dosyalarda naz yapıyorlar. Yani, çözülmesi gereken şey daha çok pg_dump tarafındaymış demek ki, diye düşündüm.

pg_dump, hızlı yükleme için standart olarak her tablo için tek bir insert işlemini kullanmakta. Farklı olarak, her satıra bir insert gelecek şekilde de yedeği alabiliyorsunuz. Bu, geri getirme işlemini çok yavaşlatıyor ama iki avantajı var: Birincisi, tek bir satırda oluşabilecek bir hata tüm tablonun yüklenmesini engellemiyor. İkincisi, diff algoritmaları uygulanırken çok daha hızlı işlem yapılabiliyor.

Siz de veritabanı yedeklerinizi versiyonluyorsanız ya da bunu okuyunca iyi bir fikir gibi geldiyse, buyrun ilgili yedekleme komutu:

$ pg_dump -c -C --disable-triggers --quote-all-identifiers --column-inserts \
  --file=yedek.sql db-name