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.
źródło
Odpowiedzi:
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 ... TEMPLATE
funkcji? Po teście wyrzucasz tę bazę danych. Zatem twoim ograniczeniem prędkości jest zasadniczo tylko czas docp -R
katalogu bazy danych. To prawie tak szybko, jak to możliwe bez magii migawek systemu plików.źródło
Użyj Stellar , to jest jak git dla baz danych:
źródło
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ć).
źródło
Prawdopodobnie nie jest to odpowiedź, na którą liczysz, ale czy zastanawiałeś się nad niższym poziomem migawek - na przykład LVM?
źródło
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:
źródło
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.
źródło
Chociaż muszę powiedzieć, że
Stellar
igit reset --hard
jest ciekawym rozwiązaniem, będę mieć problem z większych baz danych i badań, a ja korzystając zVirtualbox
rozwiązań itd, jak zawsze, w większych badaniach, to stać się nieco bardziej „problematyczne” Kiedy używają gołych metali itp.Dlatego muszę wspomnieć
ZFS
o 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:aby wykonać test, tuż przed testem wykonaj postgresql jak wyżej,
zfs snapshot $SNAPSHOT
uruchom postgresql, a następnie wycofaj, zatrzymaj postgresql i po prostuzfs rollback $SNAPSHOT
Kompresja - Postgresql uzyskuje typową kompresję 3: 1 w moich bazach danych, więc możesz wykonać więcej testów;)
źródło