Trudno mi było znaleźć dobre przykłady zarządzania schematami bazy danych i danymi między serwerami programistycznymi, testowymi i produkcyjnymi.
Oto nasza konfiguracja. Każdy programista ma maszynę wirtualną, na której działa nasza aplikacja i baza 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 zatwierdzą do SVN.
Chcemy wdrożyć serwer programistyczny z ciągłą integracją, na którym zawsze będzie działać najnowszy zatwierdzony kod. Jeśli zrobimy to teraz, baza danych zostanie ponownie załadowana z SVN dla każdej kompilacji.
Mamy serwer testowy (wirtualny), na którym działają „kandydaci do wydania”. Wdrażanie na serwer testowy jest obecnie bardzo ręcznym procesem i zwykle wymaga załadowania najnowszego kodu SQL z SVN i poprawienia go. Ponadto dane na serwerze testowym są niespójne. Otrzymujesz dane testowe, które ostatni programista zatwierdził na swoim serwerze piaskownicy.
Tam, gdzie wszystko się psuje, jest wdrożenie do produkcji. Ponieważ nie możemy zastąpić aktywnych danych danymi testowymi, wymaga to ręcznego ponownego utworzenia wszystkich zmian schematu. Gdyby było wiele zmian schematu lub skryptów konwersji w celu manipulowania danymi, może to być naprawdę skomplikowane.
Gdyby problem dotyczył tylko schematu, byłby to łatwiejszy problem, ale w bazie danych znajdują się „podstawowe” dane, które są również aktualizowane podczas opracowywania, takie jak metadane w tabelach zabezpieczeń i uprawnień.
To największa bariera, jaką widzę w dążeniu do ciągłej integracji i jednoetapowych kompilacji. Jak ty go rozwiązać?
Pytanie uzupełniające: jak śledzić wersje bazy danych, aby wiedzieć, które skrypty należy uruchomić, aby zaktualizować daną instancję bazy danych? Czy tabela wersji, o której wspomina Lance, znajduje się poniżej standardowej procedury?
Dzięki za odniesienie do Tarantino. Nie pracuję w środowisku .NET, ale ich strona wiki DataBaseChangeMangement okazała się bardzo pomocna. Szczególnie ta prezentacja Powerpoint (.ppt)
Mam zamiar napisać skrypt w Pythonie, który sprawdza nazwy *.sql
skryptów w danym katalogu w tabeli w bazie danych i uruchamia te, których nie ma, w kolejności na podstawie liczby całkowitej, która stanowi pierwszą część nazwy pliku. Jeśli jest to całkiem proste rozwiązanie, a podejrzewam, że będzie, to zamieszczę je tutaj.
Mam do tego działający skrypt. Obsługuje inicjalizację bazy danych, 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. Ma około 200 linii, więc nie opublikuję tego (chociaż mogę umieścić go na pastebinie, jeśli jest zainteresowanie).