Kontrola źródła bazy danych

57

Czy pliki bazy danych (skrypty itp.) Powinny być pod kontrolą źródła? Jeśli tak, jaka jest najlepsza metoda, aby go zachować i tam zaktualizować?

Czy istnieje nawet potrzeba, aby pliki bazy danych były pod kontrolą źródła, ponieważ możemy umieścić je na serwerze programistycznym, gdzie każdy może z niego korzystać i wprowadzać w nim zmiany w razie potrzeby. Ale wtedy nie możemy go odzyskać, jeśli ktoś coś zepsuje.

Jakie podejście najlepiej zastosować do baz danych dotyczących kontroli źródła?

TheBoyan
źródło
23
Tysiąc razy TAK! Proste pytanie zasługuje na prostą odpowiedź.
wałek klonowy
1
Czy nie było kiedyś tak dużej dyskusji na ten temat na stackoverflow.com?
FrustratedWithFormsDesigner
7
Pliki bazy danych SQL (ddl, dml) są kodami. Cały kod powinien znajdować się w systemie kontroli wersji.
dietbuddha,
4
Aha! Myślę, że tego właśnie szukałem: stackoverflow.com/questions/115369/…
FrustratedWithFormsDesigner,
1
Baza danych nie tylko powinna być pod kontrolą źródła, ale powinien istnieć jeden skrypt, który można uruchomić, aby odtworzyć od zera, czyli tabele, sekwencje, widoki, pakiety itp.
Ben

Odpowiedzi:

42

Tak. Powinieneś być w stanie odbudować dowolną część systemu z kontroli źródła, w tym bazę danych (i argumentowałbym również pewne dane statyczne).

Zakładając, że nie chcesz mieć do tego narzędzia, sugeruję, aby uwzględnić następujące elementy:

  • Skrypty tworzenia podstawowych struktur tabel, w tym schematów, użytkowników, tabel, kluczy, wartości domyślnych i tak dalej.
  • Skrypty aktualizacji (zmieniające strukturę tabeli lub migrujące dane z poprzedniego schematu do nowego schematu)
  • Skrypty tworzenia dla procedur przechowywanych, indeksów, widoków, wyzwalaczy (nie musisz się martwić o ich aktualizację, ponieważ po prostu nadpisujesz to, co było za pomocą odpowiedniego skryptu tworzenia)
  • Skrypty do tworzenia danych, aby uruchomić system (pojedynczy użytkownik, dowolne dane ze statycznej listy wyboru itp.)

Wszystkie skrypty powinny zawierać odpowiednie instrukcje upuszczania i być napisane, aby można je było uruchamiać jak każdy użytkownik (w tym powiązane prefiksy schematu / właściciela, jeśli są istotne).

Proces aktualizacji / tagowania / rozgałęzienia powinien przebiegać dokładnie tak jak reszta kodu źródłowego - nie ma sensu robić tego, jeśli nie można skojarzyć wersji bazy danych z wersją aplikacji.

Nawiasem mówiąc, kiedy mówisz, że ludzie mogą po prostu zaktualizować serwer testowy, mam nadzieję, że masz na myśli serwer programistyczny. Jeśli programiści aktualizują serwer testowy w locie, to patrzysz na świat bólu, gdy chodzi o wypracowanie tego, co musisz wydać.

Jon Hopkins
źródło
czy istnieją narzędzia automatyzujące przesyłanie właściwości SP konfiguracji bazy danych do kontroli wersji bez konieczności robienia tego ręcznie?
Ali
@Ali: napisz SP w pliku płaskim, który jest sterowany wersją. Niech to będzie wejście do skryptu db, który uruchamia migracje.
dietbuddha,
18

Tak.

jaka jest najlepsza metoda, aby go zachować i zaktualizować?

Um. Napisz skrypt konstruktora schematów. Sprawdź to po wprowadzeniu zmian. Sprawdź to przed uruchomieniem.

Trudno określić, o co prosisz.

Napisz formalne skrypty migracji schematu. Sprawdź je po testach. Sprawdź je przed uruchomieniem.

Co jeszcze tam jest?

To, co się dzieje, polega na tym, że zmiany schematu stają się poważnymi problemami, ponieważ schemat ewoluuje organicznie poprzez szereg nieudokumentowanych zmian.

Ta ewolucja organiczna utrudnia migrację schematu, ponieważ nie ma „wiarygodnego” źródła tego, co powinno tam być. Istnieją dwie nieco różne wersje produkcyjne, wersja przejściowa, wersja kontroli jakości i osiem wersji programistycznych. Wszystko nieco inne.

Jeśli istniało jedno wiarygodne źródło, migracja schematu jest tylko różnicą między ostatnią wersją a tą wersją.

S.Lott
źródło
7

tak

Skrypty bazy danych (ddl, dml) są kodami. Cały kod powinien znajdować się w systemie kontroli wersji.

Migracje

  • Użyj migracji bazy danych

Pozwala używać tych samych plików db w programistyce, qa i wydaniach.

  • Zwolnij do bazy danych z numerem wydania

Przechowuj numer wydania gdzieś do kontroli, wiele przechowuje go w samej bazie danych. Każde wydanie będzie składało się z migracji, które doprowadzą bazę danych do poprawnej wersji.

dietbuddha
źródło
7

Istnieją narzędzia takie jak Liquibase, które mają zapewnić kontrolę źródła dla baz danych. Utrzymywanie skryptów zmiany / aktualizacji w zwykłym narzędziu kontroli źródła jest kłopotliwe, jak robi to wiele firm i nie zawsze można ponownie wdrożyć bazę danych od zera.

Próbowaliśmy również zautomatyzować to za pomocą narzędzi do porównywania baz danych (porównanie danych podstawowych i baz danych klientów), co pomogło, ale nie można ufać takim narzędziom w 100%, zdecydowanie potrzebny jest również proces przeglądu.

Sokół
źródło
Właśnie przyjrzałem się narzędziu Liquibase, które wskazałeś. To wygląda interesująco. Jak to działa z bazami danych SQL Server? Czy miałeś jakieś doświadczenie?
TheBoyan
1
@bojanskr: Obawiam się, że nie mam żadnych doświadczeń, ale strona zawiera listę SQL Server jako obsługiwaną z „bez problemów”.
Falcon
dzięki za wskazówkę. Twoja rada była bardzo pomocna.
TheBoyan
5

tak

I jeszcze, będziesz chciał gałęzi .


Używam Git do oddziałów:

  • dla rozwoju według funkcji (tak jak robimy to dla regularnego rozwoju pozostałej części aplikacji)

  • i jeden również dla serwera produkcyjnego, ponieważ klienci korzystający z aplikacji również tworzą zawartość.

W ten sposób zyskujesz korzyści z kontroli źródła i rozgałęziania zarówno dla kodów źródłowych, jak i bazy danych (i innych posiadanych plików).


Nie znalazłem jeszcze systemu typu „wszystko w jednym” [dla PostgreSQL], więc musiałem pisać funkcje / skrypty, aby poprawnie reindeksować podczas łączenia gałęzi (np. Żaden indeks z gałęzi produkcyjnej nie powinien być modyfikowany, ponieważ klienci polegają na nich, podczas gdy indeksy + klucze obce z gałęzi programistycznej, które przecinają się z zawartością produkcyjną, powinny zostać ponownie zindeksowane: nie działałoby to dla wszystkich aplikacji, ale obejmuje wszystkie przypadki naszej aplikacji, więc jest wystarczająco dobre).

Ale ogólną ideą jest to, że zawartość bazy danych jest istotną częścią aplikacji, a wszystkie zasoby powinny być pod kontrolą źródła , ergo tak, powinieneś również używać kontroli źródła dla bazy danych.

dzikie piki
źródło
5

W przypadku Javy nasz zespół korzysta z Flyway , który jest dla nas naprawdę łatwy w użyciu i wydajny.

Jeśli pracujesz w Rubim, Railsy mają migracje, które są również skutecznym sposobem radzenia sobie z tym problemem.

Wspomniano już o Liquibase - to dobre rozwiązanie, ale uważam, że jest bardziej kłopotliwe niż alternatywy takie jak Flyway.

Ponadto oprogramowanie RedGate oferuje produkt o nazwie SQL Source Control , przeznaczony dla SQL Server. Sam go nie użyłem, ale jeden z moich współpracowników mówi, że jest świetny.

Daniel Pryden
źródło
3

Oto problem, który widziałem wiele razy, gdy nie ma kontroli wersji ani zarządzania zmianami w programistycznych bazach danych. Programator A dokonuje zmian w tabeli, widoku lub proc. Programista B dokonuje zmiany tego samego i zastępuje to, co zrobił Programator A. Lub DBA przywraca produkcyjną bazę danych do programowania i zastępuje zmiany. Widziałem tego rodzaju rzeczy powodujące znaczny smutek tak wiele razy, że to nie jest śmieszne. Dotyczy to tylko systemów programistycznych. Rzeczy mogą stać się naprawdę nieprzyjemne, gdy są przygotowywane / testowane, a nawet serwery produkcyjne zostają w to wciągnięte.

Kontrola wersji bazy danych nie musi być taka sama jak zwykła kontrola wersji kodu, aby była skuteczna. Jednak niektóre kopie zapasowe kontroli zmian i historii zapobiegną wielu problemom.

jfrankcarr
źródło
Ten artykuł może Cię zainteresować: martinfowler.com/articles/evodb.html
Falcon
2

Pomyśl o tym jak o „kontroli wersji”, a nie „kontroli źródła”. Oznacza to, że możesz zobaczyć całą historię tego konkretnego skryptu. To, czy uda ci się odbudować bazę danych do jej obecnej postaci, będzie bardziej zależało od twoich praktyk dotyczących tych skryptów i wszelkich frameworków używanych do ich tworzenia.

Bill Leeper
źródło
0

Do naszych projektów PHP / MySQL używaliśmy (kiedyś) małego narzędzia o nazwie Ladder . Został zaprojektowany w celu ułatwienia organicznego wzrostu bazy danych w czasie. Wszystkie migracje dla projektu są przechowywane w kontroli wersji / źródła / wersji i są śledzone wraz z kodem.

Obsługuje dodawanie / zmienianie / upuszczanie kolumn, uruchamianie zapytań, dodawanie / upuszczanie indeksów, ograniczenia itp. Itp. Będzie śledził stan bazy danych i zastosuje wszelkie brakujące migracje. Pozwala także „cofnąć się w czasie”, określając migrację, w której musisz być. ( php ladder.php migrate 15)

Aha, a najnowszym dodatkiem jest różnicowanie bazy danych. Uruchom diff-savepolecenie, dodaj i usuń niektóre kolumny z bazy danych, a następnie uruchom diffpolecenie. Zobaczysz automatycznie wygenerowany kod migracji na podstawie stanu bazy danych.

Drarok
źródło
0

DataGrove rozwiązuje niektóre problemy wymienione tutaj ( na przykład przez jfrankcarr ).

Śledzi wszystkie zmiany w bazie danych i pozwala zapisać wersję całego stanu bazy danych w repozytorium. Pozwala to na odrodzenie wielu wirtualnych kopii tego samego DB, dzięki czemu każdy programista lub DBA może mieć własną osobną kopię (każda kopia wirtualna może być spawnowana z innej wersji). Zapewni to, że nikt nie zastąpi cudzego kodu / zmian. Każda z wirtualnych kopii jest również śledzona w tych samych repozytoriach, dzięki czemu można łatwo udostępniać i odtwarzać wszystkie stany bazy danych.

Taichman
źródło
0

Chciałbym również przynieść narzędzie do monitorowania, które może być również używane jako narzędzie do kontroli wersji danych. Narzędzie, o którym mówię, to MONyog, w rzeczywistości jest to narzędzie do monitorowania MySQL, ale przy niewielkim włamaniu możemy łatwo użyć go jako wersji danych.

Ale zanim przejdę dalej, zacytuję, że nie będzie wskazane umieszczanie całej bazy danych do wersji. Śledzenie zmian określonego zestawu danych jest prawdziwym zabójcą.

MONyog ma funkcję o nazwie CSO (Custom SQL Objects), która może monitorować zmiany w określonym zestawie danych. Dodawanie CSO opisano tutaj . Teraz w sekcji historii monitorowania MONyoga możesz uzyskać zmiany w określonym czasie. Najlepiej, daje wizualny raport na stronie HTML. Raport będzie wyglądał mniej więcej tak wprowadź opis zdjęcia tutaj

rituparnakashyap
źródło