Czy możliwe jest szybkie tworzenie / przywracanie migawek bazy danych za pomocą PostgreSQL?


52

Przede wszystkim jestem programistą, nie DBA ani sysadmin; proszę bądź delikatny :)

Pracuję nad przepływem pracy aplikacji, w którym pojedyncza akcja użytkownika wywoła złożone zmiany w bazie danych - tworzenie setek rekordów w niektórych tabelach, aktualizowanie setek rekordów w innych itp. W sumie około 12 tabel (z ~ 100 ) są dotknięte tą czynnością. Ze względu na złożoność bardzo trudno mi ręcznie cofnąć wszystkie zmiany, zanim będę mógł uruchomić kolejny test. Przez większość mojego czasu programowania mogę po prostu wstawić instrukcję „ROLLBACK” pod koniec przepływu pracy, ale kiedy zbliżam się do zatwierdzenia moich zmian, muszę przetestować prawdziwą rzecz.

Mam lokalną kopię produkcyjnej bazy danych do pracy. W moim przypadku zrzucanie i przywracanie między testami jest szybsze niż pisanie skryptu, aby cofnąć wszystkie zmiany. Jest szybszy, ale wciąż bardzo mnie spowalnia (przywracanie zajmuje około 20 minut na moim starzejącym się laptopie). Czy jest jakiś sposób, aby zapisać migawkę bieżącego stanu bazy danych, a następnie szybko ją przywrócić?

Jestem gwarantem, że jestem jedynym użytkownikiem w systemie i mam dostęp do konta root. Zrzut bazy danych wynosi ~ 100 MB po tar'owaniu i gzip'owaniu. Wersja PostgreSQL to 8.3.

Z góry dziękuję za wszelkie pomocne pomysły.


Mówisz, że masz zrzut bazy danych, czy to nie wystarczy? Przetestuj system, jeśli izometria pójdzie nie tak, użyj zrzutu, aby przywrócić DB do pierwotnego stanu i kontynuować rozwój.
DrColossos,

1
Czy przywracasz tylko zmienione tabele?
Jack Douglas,

1
@Jack Douglas: Przywracam całą bazę danych ze zrzutu. Tabele, o których mowa, stanowią około 2/3 danych, a ja nadal musiałbym się martwić o prawidłową kolejność przywracania i ograniczenia klucza obcego.
Zilk

1
@DrColossus: tak, zrzuty są wystarczające, aby przywrócić poprzedni stan, ale ich tworzenie i stosowanie jest bardzo wolne.
Zilk

Odpowiedzi:


35

Możesz użyć migawek na poziomie systemu plików, ale często jest to dość kłopotliwe, wymaga specjalnych systemów plików i nie zawsze jest dostępne, szczególnie na starzejących się laptopach. ;-)

A może utworzysz stan bazowy jako bazę danych, a następnie utworzysz z niego nową bazę danych do uruchomienia testowego, korzystając z tej CREATE DATABASE ... TEMPLATEfunkcji? Po teście wyrzucasz tę bazę danych. Zatem twoim ograniczeniem prędkości jest zasadniczo tylko czas do cp -Rkatalogu bazy danych. To prawie tak szybko, jak to możliwe bez magii migawek systemu plików.


To bardzo dobry pomysł. W ogóle nie myślałem o szablonach baz danych. Dziękuję Ci!
Zilk

1
To świetne rozwiązanie, 5-krotnie szybsze niż przywracanie po upuszczeniu, ale ma jedną wadę: przed zrobieniem tego musisz porzucić bieżące połączenia, w przeciwnym razie nie będzie działać.
sorin

Aktualizacja: nie będzie działać w środowisku produkcyjnym, ponieważ źródłowa baza danych będzie miała z nią połączenia. Potrzebujemy innego rozwiązania.
sorin

11

Użyj Stellar , to jest jak git dla baz danych:

Stellar pozwala szybko przywrócić bazę danych, np. Podczas pisania migracji baz danych, przełączania gałęzi lub bałagania w SQL. Obsługiwane są PostgreSQL i MySQL (częściowo).



Liquibase nie obsługuje go tak jak Stellar, gdzie możesz pracować z bazą danych (np. w testach jednostkowych) i być może będziesz musiał cofnąć się do poprzedniego stanu lub czasu oznaczonego tagiem.
Andreas Dietrich

Stellar brzmi jak świetny pomysł, ale dla mnie nie działa
Orlando

5

Jeśli baza danych działa w Virtualbox , możesz łatwo zapisywać migawki i przywracać migawki stanu bazy danych i samego systemu operacyjnego w ciągu kilku sekund (lub 1-2 minut, jeśli naprawdę masz dużo danych w bazie danych lub systemie operacyjnym lub bardzo mało pamięci przydzielonej maszynie wirtualnej) za darmo.

W większości przypadków najlepiej byłoby zainstalować lekki system Linux (niż serwer Windows) do uruchamiania maszyny wirtualnej, na której znajduje się baza danych, pod warunkiem, że wspominasz, że masz mało zasobów na swoim laptopie.


Na stronie produkcyjnej korzystam z kopii zapasowych migawek MediaTemple , aby osiągnąć ten sam wynik (ale kosztuje to 20 $ na miejsce na kopię zapasową i jest specyficzne dla tej usługi hostingowej, więc może ci nie pasować).


Ach, nieważne, nie widziałem twojego komentarza, który wspomina, że ​​już wiesz o virtualbox.
wildpeaks

3

Prawdopodobnie nie jest to odpowiedź, na którą liczysz, ale czy zastanawiałeś się nad niższym poziomem migawek - na przykład LVM?


Tak, przyszło mi to do głowy. Niestety migawki systemu plików nie są obsługiwane przez FS, którego obecnie używam (ext3). Inną opcją byłoby skonfigurowanie maszyny wirtualnej, takiej jak Virtualbox, do testów.
Zilk

2

Znalazłem to pytanie, gdy próbowałem to zrobić, i skończyło się na użyciu git w katalogu danych postgresql. Odrzucenie zmian jest tak proste, jak:

git reset --hard

6
Nie ma to zastosowania w przypadku dużych baz danych. Plus, dlaczego torturować dupkami za pomocą plików binarnych o różnej wielkości?
RolandoMySQLDBA

0

Jeszcze inną opcją, którą można by eksperymentować, byłoby zapisanie kopii katalogu danych postgresql, a następnie po prostu przepisanie istniejącego katalogu z kopią, gdy chcesz go przywrócić. Będzie wymagało więcej miejsca na dysku, ale na pewno będzie szybsze niż przywracanie z kopii zapasowej. Nie jestem jednak pewien, czy byłoby to szybsze niż metoda szablonowa, więc dobrym pomysłem byłoby najpierw wykonać kilka testów.


0

Chociaż muszę powiedzieć, że Stellari git reset --hardjest ciekawym rozwiązaniem, będę mieć problem z większych baz danych i badań, a ja korzystając z Virtualboxrozwiązań itd, jak zawsze, w większych badaniach, to stać się nieco bardziej „problematyczne” Kiedy używają gołych metali itp.

Dlatego muszę wspomnieć ZFSo systemie plików, który należy wziąć pod uwagę w przyszłości z następujących powodów, o których wspomniał również @Peter Eisentraut:

  1. Migawki - szczególnie podczas replikacji z Prod do QA / DR, możesz użyć tego samego „systemu plików” do testów:
#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. aby wykonać test, tuż przed testem wykonaj postgresql jak wyżej, zfs snapshot $SNAPSHOTuruchom postgresql, a następnie wycofaj, zatrzymaj postgresql i po prostuzfs rollback $SNAPSHOT

  2. Kompresja - Postgresql uzyskuje typową kompresję 3: 1 w moich bazach danych, więc możesz wykonać więcej testów;)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.