Typową radą przed wdrożeniem produkcyjnym jest wykonanie kopii zapasowej bazy danych. W ten sposób, jeśli nowa aktualizacja ma jakiś problem, który może prowadzić do potencjalnej utraty lub logicznego uszkodzenia danych, nadal masz kopię zapasową do porównania i poprawienia starych rekordów.
Może to jednak działać dobrze, dopóki rozmiar bazy danych nie osiągnie kilku GB. Gdy rozmiar bazy danych jest ogromny, tworzenie kopii zapasowych zajmuje dużo czasu. Jakie są najlepsze praktyki, których należy przestrzegać w takich sytuacjach, aby uniknąć logicznego uszkodzenia danych z powodu problemów logicznych podczas wdrażania kodu?
database
patterns-and-practices
Pritam Barhate
źródło
źródło
Odpowiedzi:
Jako osoba, która regularnie zajmowała się aktualizacją produkcyjnej bazy danych dla klientów dla naszych aktualizacji oprogramowania, mówię wam, że najlepszym sposobem na zminimalizowanie błędów jest dokonywanie aktualizacji tak prosto, jak to możliwe.
Jeśli możesz dokonać zmiany we wszystkich rekordach, a nie w konkretnych, lepiej jest to zrobić.
Innymi słowy, jeśli otrzymasz listę identyfikatorów rekordów, które wymagają zmiany ich stanu, powinieneś zadać sobie pytanie, dlaczego aktualizacja jest wykonywana w kontekście programu. Może być tak, że z 10 rekordów, które musisz zaktualizować, tabela zawiera tylko 10 elementów. Dlatego powinieneś zadać sobie pytanie, czy koncepcyjnie wszystko, co robisz, to aktualizowanie stanu wszystkich rekordów.
Jeśli możesz wstawić, najlepiej.
Dodanie rekordu jest samodzielne. Rozumiem przez to, że istnieje tylko jeden efekt uboczny dodania rekordu, i jest nim rekord, który wcześniej nie istniał. Dlatego jeśli nie dodajesz rekordu, którego nie powinno tam być, nie powinno być żadnych problemów.
Jeśli możesz uniknąć usunięcia, lepiej jest.
Jeśli usuwasz, usuwasz dane, które w innym przypadku byłyby niemożliwe do odzyskania bez kopii zapasowej. Jeśli to możliwe, spróbuj uporządkować dane w taki sposób, aby można było wyłączyć rekordy, zmieniając ich stan, a nie usuwając fizycznie rekord. Nadmiar danych można umieścić na partycji lub całkowicie usunąć w późniejszym momencie, gdy masz pewność, że nie ma żadnych problemów.
Miej spójne zasady aktualizacji.
Jeśli musisz zaktualizować rekord, może się zdarzyć jedna z kilku rzeczy:
Musisz mieć politykę określającą kierunek działania, jeśli coś nie pójdzie zgodnie z planem. Dla uproszczenia powinieneś być konsekwentny i stosować tę politykę w każdej sytuacji tego typu, nie tylko w przypadku określonych tabel. Ułatwia to późniejsze odzyskiwanie danych. Ogólnie rzecz biorąc, moją zasadą jest pisanie skryptu w taki sposób, aby móc go później ponownie uruchomić. Jeśli skrypt się nie powiedzie, miło jest wiedzieć, że możesz wprowadzić odpowiednie poprawki i wykonać je ponownie, jednak możesz wybrać własną politykę, która najbardziej Ci odpowiada.
Kopie zapasowe
W żadnym wypadku nie usprawiedliwia to wykonania kopii zapasowej przed wykonaniem jakiejkolwiek aktualizacji w środowisku produkcyjnym! Chociaż nawet w przypadku kopii zapasowej uważam, że nie trzeba jej używać. Utrata danych nie może być możliwa nawet w najgorszym przypadku .
Wniosek
Nie zawsze będziesz w stanie mieć to po swojemu. Schemat tabeli prawdopodobnie nie zostanie określony przez Ciebie, a zatem oznacza to, że typy aktualizacji, których możesz oczekiwać, będą zarówno skomplikowane, jak i ryzykowne. Jeśli jednak masz coś do powiedzenia w tej sprawie, warto pamiętać o tych kwestiach, ponieważ wprowadzają one wszelkie aktualizacje bezpośrednio i bez znaczącego ryzyka.
Powodzenia!
źródło
W tym momencie powinieneś używać komercyjnego systemu DB, który obsługuje migawki (Oracles nazywa to Flashback ) - właśnie do tego właśnie służą.
Pamiętaj, że i tak potrzebujesz koncepcji tworzenia kopii zapasowych - posiadanie większej ilości danych nie oznacza, że upuszczasz kopie zapasowe, ponieważ stają się trudne, wręcz przeciwnie. Potrzebujesz pewnego rodzaju ciągłej kopii zapasowej, np. Opartej na replikacji z automatycznym przełączaniem awaryjnym.
źródło
Jest to ogromny obszar - więc spodziewaj się, że to pytanie zostanie zamknięte w dość krótkim czasie, ale z góry (jako były DBA w dużych bazach danych):
Mart / Repository
Możesz zmniejszyć ryzyko, jeśli masz osobną bazę danych dla aktualizacji i osobną bazę danych, z której wszyscy korzystają. Jest to tylko przypadek skopiowania danych z jednego DB do drugiego po przeprowadzeniu różnych kontroli. Mart / repozytorium jest czasami opisywane, ale możesz mieć podstawowy / wtórny, master / slave itp.
Kod źródłowy
Aby wszystko, co można zmienić, należy mieć kod źródłowy, który odnosi się do sposobu aktualizacji danych. Ile ich masz, różni się od DB do DB, ale możesz mieć jeden dla każdego użytkownika, roli, pliku danych, modułu kodu itp.
Utwórz / zaktualizuj datę
Coś, co może znacznie pomóc w śledzeniu, gdzie coś poszło nie tak, to tworzenie i aktualizacja danych dla każdego wiersza. Następnie możesz szybko sprawdzić, które wiersze zostały zaktualizowane.
ETL
Jeśli aktualizacja bazy danych jest częścią fabryki danych, możesz przywrócić poprzedni rocznik z plików płaskich.
Utworzyć kopię zapasową
Pełne kopie zapasowe zajmują oczywiście dużo miejsca, ale typowym scenariuszem jest wykonywanie pełnej kopii zapasowej w regularnych odstępach czasu (powiedzmy, co tydzień) i częściowych częściej (codziennie itp.).
Odzyskanie punktu w czasie
W zależności od używanego RDBMS, niektóre punkty wsparcia w odzyskiwaniu czasu. Pozwala to cofnąć się do czasu, kiedy znany był dobry stan. Wymaga to jednak dużej ilości pamięci, która zwiększa się o to, jak daleko chcesz wrócić.
Rewizja
Posiadanie tabel audytu powie Ci, kto (lub co) dokonał aktualizacji wiersza. Może to stanowić dobry punkt wyjścia do dochodzenia.
Historia
W przypadku niektórych tabel krytycznych w momencie aktualizacji pobierana jest kopia odpowiedniego wiersza, aby w razie potrzeby można było przywrócić dane.
Walidacji danych
Upewnij się, że podstawowe kontrole walidacji są przeprowadzane na danych przed ich zapisaniem - ponad podstawowe kontrole typów danych.
Więzy integralności
Integralność referencyjna nie jest srebrną kulą, ale może pomóc zapewnić dobrą strukturę danych.
źródło
Wiele razy, jeśli wykonujemy aktualizację „jednego strzału”, wykonujemy kopię zapasową produkcji i przywracamy ją na serwer testowy. Następnie tworzymy zestaw testów i uruchamiamy jeden strzał. Sprawdzamy, czy dane zmieniły się za pomocą testów i czujemy się komfortowo, że aktualizacja się powiedzie, i zmodyfikujemy dane w sposób, którego się spodziewamy. Nazywa się to próbą suchą lub próbną. Polecam to zrobić.
To daje wszystkim poczucie, że jeden strzał się powiedzie. Nie możemy zagwarantować 100%, ponieważ dane zostaną zaktualizowane od daty uruchomienia próbnego, ale zwiększamy zaufanie i czynniki sukcesu. Daje to również prawdziwy obraz wszelkich problemów, które wystąpią, ponieważ używamy kopii produkcji. Teraz, jeśli z jakiegoś powodu aktualizacja się nie powiedzie, zawsze możemy przejść do ponownego uruchomienia przed przywróceniem, jeśli to konieczne, ale powinniśmy byli znaleźć i rozwiązać wszelkie problemy z suchym uruchomieniem.
Jeśli nie możesz wziąć całej bazy danych (jeśli jest naprawdę duża), spróbuj wyeksportować mniejszy rozmiar próbki i uruchom aktualizację (mały suchy test) w stosunku do rzeczywistych danych. Wolę cały zestaw danych, jeśli to możliwe, aby upewnić się, że test jest jak najbardziej kompletny.
źródło