PostgreSQL ile veritabanı anlık görüntülerini hızlı bir şekilde oluşturmak / geri yüklemek mümkün müdür?


51

Her şeyden önce ben bir geliştiriciyim, bir DBA veya sysadmin değil; lütfen nazik ol :)

Tek bir kullanıcı işleminin veritabanındaki karmaşık değişiklikleri tetikleyeceği bir uygulama iş akışı üzerinde çalışıyorum - bazı tablolarda yüzlerce kayıt oluşturarak, diğerlerinde yüzlerce kaydı güncelleyebiliyor, vb. Sonuçta, yaklaşık 12 tablo (~ 100'den fazla) ) bu eylem tarafından dokunulur. Karmaşıklık nedeniyle, başka bir test yapmadan önce tüm değişiklikleri manuel olarak geri almak benim için çok zor. Geliştirme zamanımın çoğunda, sadece iş akışının sonuna yakın bir "ROLLBACK" ifadesi ekleyebilirim, ancak değişikliklerimi yapmaya yakın olduğumda, gerçek olanı test etmem gerekiyor.

Çalıştırılacak üretim veritabanının yerel bir kopyası var. Benim durumumda, testler arasında boşa gidip geri yüklemek, tüm değişiklikleri geri almak için bir komut dosyası yazmaktan daha hızlıdır. Daha hızlı, ancak hala beni çok yavaşlatıyor (geri yükleme yaşlanma dizüstü bilgisayarımda yaklaşık 20 dakika sürüyor). Veritabanının geçerli durumunun bir anlık görüntüsünü kaydedebilmemin ve daha sonra hızlı bir şekilde geri yükleyebilmemin bir yolu var mı?

Sistemdeki tek kullanıcı olduğumu garanti ediyorum ve root erişimim var. Veri tabanı dökümü, tar'ed ve gzip'ed ~ 100 MB'dir. PostgreSQL sürümü 8.3'tür.

Herhangi bir yardımcı fikir için şimdiden teşekkür ederiz.


Veri tabanı dökümü olduğunu söyledin, bu yeterli değil mi? Sisteminizi test edin, bir sorun olursa, DB'yi orijinal durumuna geri getirmek ve geliştirmeye devam etmek için çöplüğü kullanın.
DrColossos

1
Sadece değişen tabloları geri yüklüyor musunuz?
Jack Douglas

1
@ Jack Douglas: DB'nin tamamını çöplükten geri yüklüyorum. Söz konusu tablolar verilerin 2 / 3'ünü oluşturuyor ve hala doğru restorasyon sırası ve yabancı anahtar kısıtlamaları konusunda endişelenmek zorunda kalacağım.
Zilk

1
@DCColossus: evet, çöplükler önceki durumu geri yüklemek için yeterli, ancak bunları oluşturmak ve uygulamak çok yavaştır.
Zilk

Yanıtlar:


35

Dosya sistemi düzeyinde anlık görüntüler kullanabilirsiniz, ancak bu genellikle oldukça zahmetlidir, özel dosya sistemlerine ihtiyaç duyar ve özellikle eskimeyen dizüstü bilgisayarlarda her zaman kullanılamaz. ;-)

Temel durumunuzu veritabanı olarak oluşturup CREATE DATABASE ... TEMPLATEişlevselliği kullanarak test çalıştırmanız için yeni bir veritabanı oluşturmaya ne dersiniz? Testten sonra, o veri tabanını çöpe atıyorsun. O zaman hız sınırlamanız esasen sadece cp -Rveritabanı dizininin zamanıdır . Bu dosya sistemi anlık sihir olmadan alacağınız kadar hızlı.


Bu çok iyi bir fikir. Veritabanı şablonlarını hiç düşünmemiştim. Teşekkür ederim!
Zilk

1
Bu harika bir çözümdür, geri yüklemeden 5 kat daha hızlıdır ancak bir dezavantajı vardır: bunu yapmadan önce mevcut bağlantıları kesmeniz gerekir, aksi takdirde çalışmaz.
sorin

Güncelleme: bu üretimde çalışmayacak, çünkü kaynak veritabanı buna bağlantı sağlayacak. Başka bir çözüme ihtiyacımız var.
sorin

11

Stellar'ı kullanın , veritabanları için git gibidir :

Stellar, örneğin veritabanı geçişleri yazarken, dalları değiştirirken veya SQL ile uğraşırken hızlıca veritabanını geri yüklemenizi sağlar. PostgreSQL ve MySQL (kısmen) desteklenmektedir.



liquibase, veritabanıyla çalışabileceğiniz (örneğin birim testlerinde) ve önceki bazı etiketli durumlara veya zamanlara geri dönmek zorunda kalabileceğiniz Stellar gibi desteklemez.
Andreas Dietrich,

Stellar harika bir fikir gibi geliyor, ama benim için çalışmıyor
Orlando

5

Veritabanınız Virtualbox'ta çalışıyorsa, anlık görüntüleri kolayca kaydedebilir ve hem veritabanı durumunun hem de işletim sisteminin kendisinin anlık görüntülerini birkaç saniye içinde geri yükleyebilirsiniz (veya veritabanında veya işletim sisteminde gerçekten çok fazla veri varsa veya 1-2 dakika içinde sanal makineye ayrılan az miktarda bellek) ücretsiz.

Çoğu durumda, veritabanında barındırılan sanal makineyi çalıştırmak için, dizüstü bilgisayarınızda çok az kaynak bulunduğunu belirttiğinizde, bir Windows sunucusundan daha hafif bir linux kurmak en iyisidir.


Prodüksiyon sitesinde, aynı sonucu elde etmek için MediaTemple'ın anlık görüntü yedeklerini kullanıyorum (ancak yedekleme yuvası başına 20 $ ve bu webhosting hizmetine özgü, bu nedenle size uygun olmayabilir).


Neyse, sanal kutu hakkında zaten bildiğinizden bahseden yorumunuzu görmedim.
wildpeaks

3

Muhtemelen beklediğiniz cevap değildir, ancak daha düşük bir anlık görüntü yakalama seviyesini düşündünüz mü - örneğin LVM?


Evet, aklıma geldi. Ne yazık ki, dosya sistemi anlık görüntüleri şu anda kullandığım FS tarafından desteklenmiyor (ext3). Diğer bir seçenek ise test çalışmaları için Virtualbox benzeri bir Sanal Makine kurmak olacaktır.
Zilk

2

Aynı şeyi yapmaya çalışırken bu soruyu buldum ve postgresql veri dizininde git kullanarak sona erdi. Değişiklikleri atmak kadar kolaydır:

git reset --hard

6
Bu, büyük veritabanları için işe yaramaz. Ayrıca, git git değişik boyutlardaki ikili dosyalarla işkence yapsın?
RolandoMySQLDBA

0

Yine denenebilecek başka bir seçenek, postgresql veri dizininin bir kopyasını kaydetmek, ardından geri yüklemek istediğinizde varolan dizini kopya ile yeniden yazmak olacaktır. Bu diskte daha fazla alan gerektirir, ancak kesinlikle bir yedekten geri yüklemek kesinlikle daha hızlı olacaktır. Bunun şablon yönteminden daha hızlı olup olmadığından emin değilim, bu yüzden ilk önce bazı testler yapmak iyi bir fikir olacaktır.


0

Söylemem gerekecek Stellarve git reset --hardilginç bir çözüm olsa da, daha büyük veritabanları ve testlerle ilgili bir sorunum olacak ve Virtualboxvb çözümlerini kullanıyorum, ne zaman, daha büyük testlerde, bunları ne zaman biraz daha "sorunlu" hale getirmek için Çıplak metal vb çözümler kullanıyor.

Bu ZFSnedenle, @Peter Eisentraut'un bahsettiği nedenlerden dolayı gelecekte bunlar için göz önünde bulundurulması gereken bir dosya sistemi olarak söz etmeliyim:

  1. Anlık görüntüler - özellikle Prod'dan QA / DR'ye çoğaltma yaptığınızda, sınamalar için aynı "dosya sistemini" kullanabilirsiniz:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. bir test yapmak için, testin hemen öncesinde olduğu gibi bir postgresql durdurun zfs snapshot $SNAPSHOT, postgresql'i başlatın, sonra geri almak, postgresql'yi durdurun ve sadecezfs rollback $SNAPSHOT

  2. Sıkıştırma - Postgresql veritabanlarımda tipik bir 3: 1 sıkıştırma alır, böylece daha fazla test yapabilirsiniz;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.