Jak zarządzać bazami danych w rozwoju, testowaniu i produkcji?

Ciężko mi było znaleźć dobre przykłady zarządzania schematami baz danych i danymi pomiędzy serwerami deweloperskimi, testowymi i produkcyjnymi.

Oto nasza konfiguracja. Każdy programista posiada maszynę wirtualną z naszą aplikacją i bazą danych MySQL. To ich osobista piaskownica, aby robić, co chcą. Obecnie Programiści dokonają zmiany w schemacie SQL i wykonają zrzut bazy danych do pliku tekstowego, który zatwierdzają do SVN.

Chcemy wdrożyć serwer rozwoju ciągłej integracji, na którym zawsze będzie uruchamiany najnowszy zatwierdzony kod. Jeśli zrobimy to teraz, to przeładuje bazę danych z SVN dla każdej kompilacji.

Mamy testowy (wirtualny) serwer, który działa " release candidates."Wdrożenie na serwer testowy jest obecnie bardzo ręcznym procesem i zwykle wymaga ode mnie załadowania najnowszego SQL z SVN i jego poprawienia. Ponadto dane na serwerze testowym są niespójne. W końcu otrzymujesz dane testowe, które ostatni programista zatwierdzi miał na swoim serwerze piaskownicy.

Gdzie wszystko się psuje, to wdrożenie do produkcji. Ponieważ nie możemy nadpisać danych na żywo danymi testowymi, wiąże się to z ręcznym odtworzeniem wszystkich zmian w schemacie. Jeśli była duża liczba zmian w schemacie lub skryptów konwersji do manipulowania danymi, może to być naprawdę trudne.

Gdyby problemem był tylko schemat, byłby to łatwiejszy problem, ale w bazie danych są również" bazowe " dane, które są aktualizowane podczas tworzenia, takie jako metadane w tabelach zabezpieczeń i uprawnień.

Jest to największa bariera, jaką widzę w dążeniu do ciągłej integracji i jednoetapowej integracji. Jak ty rozwiązać?

Kolejne pytanie: Jak śledzić wersje baz danych, aby wiedzieć, które Skrypty uruchomić, aby uaktualnić daną instancję bazy danych? Czy tabela wersji, o której wspomina Lance, jest standardową procedurą?


Dzięki za odniesienie do Tarantino. Nie jestem w. NET środowiska, ale uważam, że ich strona wiki DataBaseChangeMangement jest bardzo pomocna. Szczególnie ta prezentacja Powerpoint (.ppt)

Napiszę skrypt Pythona, który sprawdza nazwy skryptów *.sql w danym katalogu względem tabeli w bazie danych i uruchamia te, których tam nie ma, w kolejności opartej na liczbie całkowitej, która tworzy pierwszą część nazwy pliku. Jeśli jest to dość proste rozwiązanie, jak podejrzewam, że będzie, to zamieszczę go proszę.


Mam do tego działający scenariusz. Obsługuje inicjalizację DB, jeśli nie istnieje i uruchamianie skryptów aktualizacji w razie potrzeby. Istnieją również przełączniki do czyszczenia istniejącej bazy danych i importowania danych testowych z pliku. To około 200 linijek, więc nie będę tego publikować (choć mogę umieścić go na pastebinie, jeśli będzie zainteresowanie).
 173
Author: Matt Miller, 2008-08-08

14 answers

Jest kilka dobrych opcji. Nie użyłbym strategii "Przywróć kopię zapasową".

  1. Skrypt wszystkie zmiany schematu i niech twój serwer CI uruchamia te skrypty w bazie danych. Mieć tabelę wersji, aby śledzić bieżącą wersję bazy danych i wykonywać skrypty tylko wtedy, gdy są one dla nowszej wersji.

  2. Użyj rozwiązania migracji. Rozwiązania te różnią się w zależności od języka, ale dla. NET używam Migrator.NET. pozwala to na wersję bazy danych i poruszaj się w górę i w dół między wersjami. Twój schemat jest określony w kodzie C#.

 54
Author: Lance Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-12 23:05:35

Twoi programiści muszą pisać skrypty zmian (schemat i zmiana danych)dla każdego błędu/funkcji, nad którymi pracują, a nie po prostu zrzucić całą bazę danych do kontroli źródła. Skrypty te uaktualnią bieżącą bazę danych produkcji do nowej wersji w rozwoju.

Twój proces budowania może przywrócić kopię produkcyjnej bazy danych do odpowiedniego środowiska i uruchomić na niej wszystkie skrypty z kontroli źródła, co zaktualizuje bazę danych do bieżącej wersji. Robimy to codziennie, aby upewnić się, że wszystkie skrypty działają poprawnie.

 28
Author: tbreffni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 21:03:32

Zobacz, jak Ruby on Rails to robi.

Najpierw są tak zwane pliki migracji, które w zasadzie przekształcają schemat bazy danych i dane z wersji N do wersji N + 1 (lub w przypadku obniżenia wersji N+1 do N). Baza danych posiada tabelę informującą o bieżącej wersji.

Testowe bazy danych są zawsze czyszczone przed testami jednostkowymi i wypełniane stałymi danymi z plików.

 13
Author: Juha Syrjälä,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-17 09:38:38

Książka Refactoring Databases: Evolutionary Database Design może dać ci kilka pomysłów na zarządzanie bazą danych. Skrócona wersja jest czytelna również w http://martinfowler.com/articles/evodb.html

W Jednym projekcie PHP+MySQL miałem numer wersji bazy danych zapisany w bazie danych, a gdy program połączy się z bazą danych, najpierw sprawdzi poprawkę. Jeśli program wymaga innej wersji, otworzy stronę do aktualizacji bazy danych. Każda aktualizacja jest określona w kodzie PHP, który zmieni schemat bazy danych i przeniesie wszystkie istniejące dane.

 10
Author: Esko Luontola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 14:41:04

Można również spojrzeć na za pomocą narzędzia, takiego jak SQL Compare , aby skrypt różnicy między różnymi wersjami bazy danych, co pozwala na szybką migrację między wersjami

 5
Author: Rad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-16 08:09:36
  • Nazwij swoje bazy danych w następujący sposób - dev_<<db>> , tst_<<db>> , stg_<<db>> , prd_<<db>> (oczywiście nigdy nie powinieneś kodować na twardo nazw db
  • w ten sposób będziesz mógł wdrożyć nawet różne typy db na tym samym serwerze fizycznym ( nie polecam tego, ale być może będziesz musiał ... if resources are tight)
  • Upewnij się, że będziesz w stanie przenosić dane między tymi automatycznie
  • oddziel Skrypty tworzenia db od population = zawsze powinno być możliwe odtworzenie db od zera i wypełnienie go ( ze starej wersji db lub zewnętrznego źródła danych
  • nie używaj łańcuchów połączeń w kodzie (nawet nie w plikach konfiguracyjnych) - użyj w szablonach łańcuchów połączeń w plikach konfiguracyjnych, które wypełniasz dynamicznie, każda rekonfiguracja application_layer, która wymaga rekompilacji, jest zła
  • używaj wersjonowania baz danych i wersjonowania obiektów db - jeśli możesz sobie na to pozwolić, użyj gotowych produktów, jeśli nie rozwijaj czegoś samodzielnie
  • śledź każdą zmianę DDL i zapisz to do jakiejś tabeli historii (przykład tutaj )
  • Codzienne kopie zapasowe ! Sprawdź, jak szybko możesz przywrócić coś utraconego z kopii zapasowej (Użyj automatycznych skryptów przywracania]}
  • nawet twoja baza DEV i PROD mają dokładnie ten sam skrypt tworzenia będziesz miał problemy z danymi, więc pozwól programistom stworzyć dokładną kopię prod i bawić się z nim ( Wiem , że otrzymam minusy dla tego, ale zmiana sposobu myślenia i proces biznesowy będzie dużo kosztować mniej, gdy gówno trafi w wentylator-więc zmuś koderów do legalnego indeksowania , cokolwiek to zrobi, ale upewnij się, że ten
 5
Author: Yordan Georgiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-01 12:20:40

To jest coś, z czego ciągle jestem niezadowolony - nasze rozwiązanie tego problemu, jakim jest. Przez kilka lat utrzymywaliśmy osobny skrypt zmian dla każdego wydania. Skrypt ten będzie zawierał delty z ostatniego wydania produkcyjnego. Z każdym wydaniem aplikacji, Numer wersji będzie zwiększany, dając coś w stylu:

  • dbChanges_1.sql
  • dbChanges_2.sql
  • ...
  • dbChanges_n. sql

To działało wystarczająco dobrze dopóki nie zaczęliśmy utrzymywać dwóch linii rozwoju: Trunk / Mainline dla nowego rozwoju i gałąź konserwacji dla poprawek błędów, krótkoterminowych ulepszeń itp. Nieuchronnie pojawiła się potrzeba wprowadzenia zmian w schemacie w gałęzi. W tym momencie mieliśmy już dbChanges_n+1.sql w bagażniku, więc skończyło się na schemacie jak poniżej:

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql
  • ...
  • dbChanges_n.3.sql

Ponownie, to działało dobrze wystarczy, aż pewnego dnia spojrzeliśmy w górę i zobaczyliśmy 42 Skrypty delta w głównej linii i 10 w gałęzi. ARGH!

W dzisiejszych czasach po prostu utrzymujemy jeden skrypt delta i pozwalamy SVN na jego wersję - tzn. nadpisujemy skrypt przy każdym wydaniu. I unikamy wprowadzania zmian w schematach w gałęziach.

Więc, ja też nie jestem z tego zadowolony. Bardzo podoba mi się koncepcja migracji z Rails. Jestem zafascynowany LiquiBase . Wspiera koncepcję przyrostowego refaktoring bazy danych. Warto się temu przyjrzeć i wkrótce przyjrzę się szczegółowo. Ktoś ma z tym doświadczenie? Byłbym bardzo ciekaw twoich wyników.

 4
Author: Matt Stine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-21 02:58:16

Mamy bardzo podobną konfigurację do OP.

Nie jest to możliwe w przypadku maszyn wirtualnych.]}

[deweloperzy wkrótce będą angażować się w prywatne oddziały]

Testowanie jest uruchamiane na różnych maszynach (w rzeczywistości w maszynach wirtualnych hostowanych na serwerze) [Wkrótce zostanie uruchomiony przez Hudson CI server]

Test przez załadowanie zrzutu odniesienia do db. Zastosuj łatki schematu programistów następnie zastosuj łatki danych programistów

Następnie uruchom unit i system testy.

Produkcja jest wdrażana do klientów jako instalatorzy.

Co robimy:

Robimy zrzut schematu naszej piaskownicy DB. Następnie zrzut danych sql. Różnimy to od poprzedniej linii bazowej. Ta para delt ma ulepszyć n-1 do n

Konfigurujemy wysypiska i delty.

Aby zainstalować wersję N CLEAN uruchamiamy zrzut do pustego db. Aby zastosować plastry, należy nałożyć plastry.

(Juha wspomniał o pomyśle Rail ' a, żeby mieć tabelę rejestrującą bieżące DB wersja jest dobra i powinna sprawić, że instalacja aktualizacji będzie mniej obarczona. )

Delty i wysypiska muszą zostać sprawdzone przed beta testami. Nie widzę sposobu na obejście tego, ponieważ widziałem deweloperów wstawiających konta testowe do DB dla siebie.

 3
Author: Tim Williscroft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 23:30:03

Obawiam się, że Zgadzam się z innymi plakatami. Programiści muszą skryptować swoje zmiany.

W wielu przypadkach prosta tabela ALTER nie będzie działać, musisz zmodyfikować istniejące dane - programiści muszą zastanowić się, jakie migracje są wymagane i upewnić się, że są poprawnie skryptowane(oczywiście musisz to dokładnie przetestować w pewnym momencie cyklu wydania).

Ponadto, jeśli masz jakiś rozsądek, przekonasz swoich programistów do wycofywania skryptów dla ich zmian, tak aby może zostać przywrócony, jeśli zajdzie taka potrzeba. Powinno to być również przetestowane, aby upewnić się, że ich rollback nie tylko wykonuje się bez błędu, ale pozostawia DB w tym samym stanie, w jakim był wcześniej (nie zawsze jest to możliwe lub pożądane, ale jest dobrą regułą przez większość czasu).

Jak to podłączyć do serwera CI, nie wiem. Być może twój serwer CI musi mieć znaną migawkę kompilacji, do której powraca każdej nocy, a następnie stosuje wszystkie zmiany od tego czasu. To chyba najlepsze, inaczej zepsuty skrypt migracji złamie nie tylko kompilację tej nocy, ale wszystkie kolejne.

 3
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-16 07:07:11

Sprawdź dbdeploy , są już dostępne narzędzia Java i. Net, możesz przestrzegać ich standardów dla układów plików SQL i tabeli wersji schematu i napisać swoją wersję Pythona.

 1
Author: Dave Marshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-22 12:53:34

Używamy wiersza poleceń mysql-diff : wyświetla różnicę między dwoma schematami bazy danych (z live DB lub script) jako ALTER script. mysql-diff jest uruchamiany przy starcie aplikacji, a jeśli schemat się zmienił, zgłasza się do programisty. Tak więc programiści nie muszą pisać zmian ręcznie, aktualizacje schematu następują półautomatycznie.

 1
Author: stepancheg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 19:55:32

Jeśli jesteś w środowisku. NET to rozwiązaniem jest Tarantino (zarchiwizowany) . Obsługuje to wszystko (w tym skrypty sql do zainstalowania) w kompilacji NANT.

 1
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 08:29:24

Napisałem narzędzie, które (podłączając się do Open DBDiff) porównuje Schematy baz danych i podpowie Ci Skrypty migracji. Jeśli dokonasz zmiany, która usunie lub zmodyfikuje dane, spowoduje to błąd, ale dostarczy sugestię dotyczącą skryptu (np. gdy brakuje kolumny w nowym schemacie, sprawdzi, czy kolumna została zmieniona i utworzy skrypt generowany przez xx.sql.sugestia zawierająca zmianę nazwy oświadczenie).

Http://code.google.com/p/migrationscriptgenerator / SQL Server tylko obawiam się: (jest też dość alpha, ale jest bardzo niski (szczególnie jeśli połączysz go z Tarantino lub http://code.google.com/p/simplescriptrunner/)

Sposób, w jaki go używam, to posiadanie projektu skryptów SQL w Twoim .sln. Masz również lokalnie bazę danych db_next, w której dokonujesz zmian (używając Management Studio lub NHibernate Schema Export lub Linqtosql CreateDatabase czy coś). Następnie wykonujemy migrationscriptgenerator z DBs _dev i _next, który tworzy. Skrypty aktualizacji SQL do migracji.

 0
Author: mcintyre321,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-12 14:23:55

Dla bazy danych oracle używamy narzędzi Oracle-ddl2svn .

To narzędzie zautomatyzowało następny proces

  1. dla każdego schematu db pobierz schemat DDL
  2. umieścić go w wersji contol

Zmiany pomiędzy instancjami rozwiązywanymi ręcznie

 0
Author: qwazer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-12 14:10:41