it-swarm.dev

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

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 - tworząc setki rekordów w niektórych tabelach, aktualizując setki rekordów w innych itp. W sumie około 12 tabel (z ~ 100 ) są dotknięte tym działaniem. 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.

54
Zilk

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, używając CREATE DATABASE ... TEMPLATE funkcjonalność. Po teście wyrzucasz tę bazę danych. Zatem ograniczenie prędkości to w zasadzie tylko czas na cp -R katalog bazy danych. To prawie tak szybko, jak to możliwe bez magii migawek systemu plików.

36
Peter Eisentraut

Użyj Gwiezdny , to jest jak git dla bazy danych:

Stellar pozwala szybko przywrócić bazę danych, gdy jesteś np. pisanie migracji baz danych, przełączanie gałęzi lub bałagan w SQL. Obsługiwane są PostgreSQL i MySQL (częściowo).

12
David Portabella

Jeśli baza danych działa w trybie 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 uruchomienia maszyny wirtualnej, na której znajduje się baza danych, pod warunkiem, że masz mało zasobów na swoim laptopie.


Na stronie produkcyjnej używam kopii zapasowych migawki 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ć).

5
wildpeaks

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

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
2
user92843

Chociaż muszę powiedzieć, że Stellar i git reset --hard jest interesującym rozwiązaniem, będę mieć problem z większymi bazami danych i testami, i używam rozwiązań Virtualbox itd., jednak w większych testach stają się one bardziej „problematyczne”, gdy używasz rozwiązań typu bare metal itp.

Dlatego MUSIMY wymienić ZFS jako system 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. zrobić test, tuż przed testem wykonaj postgresql jak wyżej, zfs snapshot $SNAPSHOT uruchom postgresql, a następnie wycofaj, zatrzymaj postgresql i po prostu zfs rollback $SNAPSHOT

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

0
Hvisage

Jeszcze inną opcją, którą można 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
Haroldo_OK