Jak mogę ustawić bazę danych pod git (kontrola wersji)?


274

Robię aplikację internetową i muszę zrobić gałąź dla pewnych poważnych zmian, rzecz w tym, że zmiany te wymagają zmian w schemacie bazy danych, więc chciałbym również objąć całą bazę danych git.

W jaki sposób mogę to zrobić? czy istnieje jakiś folder, który mogę przechowywać w repozytorium git? Skąd mam wiedzieć, który? Jak mogę się upewnić, że umieszczam odpowiedni folder?

Muszę się upewnić, ponieważ zmiany te nie są kompatybilne wstecz; Nie mogę sobie pozwolić na spieprzenie.

Baza danych w moim przypadku to PostgreSQL

Edytować:

Ktoś zasugerował wykonanie kopii zapasowych i poddanie pliku kopii zapasowej kontroli wersji zamiast bazy danych. Szczerze mówiąc, trudno mi to przełknąć.

Musi być lepszy sposób.

Aktualizacja:

OK, więc nie ma lepszego sposobu, ale wciąż nie jestem do końca przekonany, więc zmienię nieco pytanie:

Chciałbym poddać całą bazę danych kontroli wersji, jakiego silnika bazy danych mogę użyć, aby móc przekazać aktualną bazę danych kontroli wersji zamiast zrzutu?

Czy sqlite byłby przyjazny dla Gita?

Ponieważ jest to tylko środowisko programistyczne, mogę wybrać dowolną bazę danych.

Edycja2:

Naprawdę chcę nie śledzić mojej historii rozwoju, ale móc przejść z gałęzi „nowych radykalnych zmian” do „bieżącej stabilnej gałęzi” i na przykład naprawić niektóre błędy / problemy itp. stabilna gałąź. Tak, że kiedy przełączam gałęzie, baza danych automatycznie staje się kompatybilna z gałęzią, w której aktualnie pracuję. Tak naprawdę nie dbam o rzeczywiste dane.


5
Szczerze mówiąc, po prostu wykonuję kopie bazy danych, jeśli wprowadzam zmiany schematu i mam do czynienia z wieloma gałęziami programistycznymi jednocześnie ... bazy danych deweloperów powinny być na tyle małe, aby to zrobić. Uważam każdy system, który starałby się być sprytny i wprowadzał zmiany w DB tylko dlatego, że podejrzewałem zmianę gałęzi źródłowej. Chciałbym również mieć pewność, że nadal będę działać, jeśli po prostu sklonuję obszar roboczy i będę miał jedną gałąź w jednym miejscu, a drugi w nowym.
araqnid


Jeśli weźmiesz pod uwagę skrypt (i jego komponenty) inicjujący bazę danych jako artefakt pod kontrolą wersji, wówczas „kopie zapasowe” mogą nie wydawać się takie złe. Jeśli zmienisz schemat db w gałęzi radykalnej, musisz zaktualizować skrypt, który inicjuje bazę danych danymi.
Fuhrmanator

1
Sprawdź moją odpowiedź na oprogramowanie, które robi to dokładnie: stackoverflow.com/a/28123546/1662984
Kevin

Odpowiedzi:


140

Zamiast tego zrób zrzut bazy danych i kontroluj wersję. W ten sposób jest to płaski plik tekstowy.

Osobiście sugeruję, aby zachować zarówno zrzut danych, jak i zrzut schematu. W ten sposób przy użyciu diff można dość łatwo zobaczyć, co zmieniło się w schemacie od wersji do wersji.

Jeśli dokonujesz dużych zmian, powinieneś mieć dodatkową bazę danych, do której wprowadzasz zmiany w schemacie i nie dotykać starej, ponieważ, jak powiedziałeś, tworzysz gałąź.


132
Co? Musi być lepszy sposób.
hasen

18
Pliki bazy danych PostGreSQL są plikami binarnymi, możesz umieścić je w swoim repozytorium git, po prostu nie będziesz w stanie zrobić na nich żadnych różnic, a wszelkie zmiany najprawdopodobniej zmienią całą bazę danych, a zatem musisz teraz wysłać pełną baza danych przez drut do repozytorium git i zapisz go. Jest to nieefektywne, wolne i sprawia, że ​​praca z nim jest niezwykle trudna. Ponadto nie jestem pewien, czy pliki bazy danych przechowywane na dysku bez VACUUM i wyłączanie PostgreSQL w celu wykonania kopii są „stabilne”, ponieważ wszystkie dane są zawsze poprawne, co może spowodować uszkodzenie danych.
X-Istence

6
Hmm rozumiem! Cóż, czy istnieją systemy db, które są bardziej przyjazne dla git?
hasen

16
Ten rodzaj rozwiązania jest dość standardowy, a schemat jest w rzeczywistości kodem źródłowym.
Dana the Sane

12
jest 2017, jakieś aktualizacje na to pytanie? czy tak naprawdę nie ma kontroli wersji DB po wyjęciu z pudełka? naprawdę?
Stavm,

48

Sprawdź Refaktoryzacyjne bazy danych ( http://databaserefactoring.com/ ), aby poznać kilka dobrych technik utrzymywania bazy danych w tandemie ze zmianami kodu.

Wystarczy powiedzieć, że zadajesz złe pytania. Zamiast umieszczać bazę danych w git, powinieneś rozkładać zmiany na małe, weryfikowalne kroki, abyś mógł z łatwością migrować / przywracać zmiany schematu.

Jeśli chcesz mieć pełną możliwość odzyskania, powinieneś rozważyć zarchiwizowanie dzienników WAL postgres i użyć PITR (odzyskiwanie w czasie), aby odtwarzać / przekazywać transakcje do określonych znanych dobrych stanów.


2
Nie znalazłem odpowiednich informacji na stronie refaktoryzacji bazy danych ... Wygląda na to, że zawiera listę różnych technik refaktoryzacji kodu DB (podobnie jak Fowler dla zwykłego kodu)
Nickolay

26

Zaczynam myśleć o naprawdę prostym rozwiązaniu, nie wiem, dlaczego wcześniej o tym nie myślałem !!

  • Zduplikuj bazę danych (zarówno schemat, jak i dane).
  • W gałęzi dla nowych głównych zmian po prostu zmień konfigurację projektu, aby użyć nowej zduplikowanej bazy danych.

W ten sposób mogę przełączać gałęzie bez obawy o zmiany schematu bazy danych.

EDYTOWAĆ:

Przez duplikat mam na myśli utworzenie innej bazy danych o innej nazwie (np. my_db_2); nie robić zrzutu ani nic takiego.


3
To wydaje się być najprostszym i najbardziej wydajnym rozwiązaniem, ale byłoby miło, gdyby istniał jakiś sposób na zautomatyzowanie tego ... Jestem zaskoczony, że nie ma tam jeszcze czegoś ...
JustMaier

git hook, aby utworzyć bazę danych z szablonu na podstawie nazwy oddziału,
dalore

Tak właśnie robię, dodam również wiersz kontrolny IP do pliku dołączania dla zmiennych DB, aby przypadkowo załadować plik „niewłaściwej” gałęzi na serwer na żywo, nic się nie psuje.
liamvictor

więc prawie każda gałąź ma własną bazę danych, co? 🤔
olli

19

Użyj czegoś takiego jak LiquiBase, co pozwoli ci zachować kontrolę nad wersjami plików Liquibase. możesz otagować zmiany tylko dla produkcji i poprosić lb o aktualizowanie bazy danych dla produkcji lub rozwoju (lub dowolnego innego schematu).


3
Najlepsze praktyki Liguibase zalecają utrzymywanie skryptów do tworzenia schematów jako zestawu skryptów sekwencyjnych, które należy uruchamiać w kolejności. Chociaż jest to dobra najlepsza praktyka, nie widzę, jak by to działało bez centralnego repozytorium, które nie jest GIT.
Frank Schwieterman,

1
Cóż, działałoby to dobrze w git, jeśli ostrożnie podchodzisz do tagów id = i author =. Teoretycznie każdy użytkownik miałby swój własny wpis autora (DOBRY), a jeśli zrobisz coś rozsądnego z id =, powiedz YYYYMMDD_REV, to jesteś całkiem dobry. Nawet z git większość ma „centralne repo” dla danego projektu. 99% ludzi nie ma czegoś „centralnego”. Ponownie, pliki Liquibase są po prostu tekstowymi plikami XML, zawierającymi stos poleceń do wykonania na danym DB (lub zestawie). Szanse są 99% wszystkich projektów miałoby 0 problemów wynikających z tego w praktyce, nawet z DVCS.
zie

+1 za tę odpowiedź. Tego używamy w kilku projektach. Identyfikatory muszą być unikalne tylko w jednym pliku xml. Jeśli nazywasz identyfikatory z implementowanego przypadku użycia, są one wystarczająco unikalne. Musisz uważać, aby nie modyfikować już zastosowanych zestawów zmian, w przeciwnym razie pojawią się błędy sumy kontrolnej.
Bernardn

7

W obliczu podobnej potrzeby zwróciłem uwagę na moje badania systemów kontroli wersji baz danych:

  1. Sqitch - otwarte oprogramowanie oparte na perlu; dostępne dla wszystkich głównych baz danych, w tym PostgreSQL https://github.com/sqitchers/sqitch
  2. Mahout - tylko dla PostgreSQL; kontrola wersji schematu bazy danych open source. https://github.com/cbbrowne/mahout
  3. Liquibase - kolejny kontroler wersji db open source sw. darmowa wersja Datical. http://www.liquibase.org/index.html
  4. Datical - komercyjna wersja Liquibase - https://www.datical.com/
  5. Flyway by BoxFuse - Commercial SW. https://flywaydb.org/
  6. Kolejny projekt open source https://gitlab.com/depesz/Versioning Autor zapewnia przewodnik tutaj: https://www.depesz.com/2010/08/22/versioning/
  7. Red Gate Change Automation - tylko dla SQL Server. https://www.red-gate.com/products/sql-development/sql-change-automation/

W przeszłości istniało także coś takiego ChronicDB: ChronicDB provides dynamic database upgrades with zero database downtime and inconsistencies. crunchbase.com/organization/chronicdb#section-overview Facet o imieniu Kristis Makris był jednym z założycieli, być może znanym z SCMBug: mkgnu.net/scmbug
Thorsten Schöning

6

Istnieje świetny projekt o nazwie Migracje w ramach Doktryny, który został zbudowany właśnie w tym celu.

Jest nadal w stanie alfa i zbudowany dla php.

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/index.html


ops! twój link jest zepsuty ... może masz na myśli to: github.com/doctrine/migrations
Francesco Casula

tutaj dokumenty pakietu integrującego migracje doktryn w Symfony2: symfony.com/doc/master/bundles/DoctrineMigrationsBundle/...
Francesco Casula

1
Dzięki za wskazówkę, faceci Doctrine mają tendencję do zmiany lokalizacji dokumentów, co powoduje wiele niedziałających linków, zarówno tutaj, jak i w Google. Naprawiono link.
Hakan Deryal

4

Natknąłem się na to pytanie, ponieważ mam podobny problem, w którym coś zbliżonego do struktury katalogów opartej na DB, przechowuje „pliki” i potrzebuję git, aby nim zarządzać. Jest dystrybuowany w chmurze przy użyciu replikacji, stąd jego punkt dostępu będzie za pośrednictwem MySQL.

Istota powyższych odpowiedzi wydaje się w podobny sposób sugerować alternatywne rozwiązanie zadanego problemu, który nie ma sensu, używając Gita do zarządzania czymś w bazie danych, więc spróbuję odpowiedzieć na to pytanie.

Git to system, który w istocie przechowuje bazę danych delt (różnic), którą można ponownie złożyć w celu odtworzenia kontekstu. Normalne użycie git zakłada, że ​​kontekst jest systemem plików, a te delty są różnicami w tym systemie plików, ale tak naprawdę wszystko to jest hierarchiczną bazą danych delt (hierarchiczną, ponieważ w większości przypadków każda delta jest zatwierdzeniem z co najmniej 1 rodzice ułożeni na drzewie).

Tak długo, jak możesz wygenerować deltę, teoretycznie git może ją przechowywać. Problem polega zwykle na tym, że git oczekuje kontekstu, w którym generuje deltę, jako system plików, i podobnie, kiedy kasujesz punkt w hierarchii git, spodziewa się wygenerować system plików.

Jeśli chcesz zarządzać zmianami, w bazie danych masz 2 dyskretne problemy i rozwiązałbym je osobno (gdybym był tobą). Pierwszy to schemat, drugi to dane (chociaż w twoim pytaniu stwierdzasz, że dane nie są czymś, o co się martwisz). Problemem, który miałem w przeszłości, była baza danych Dev i Prod, w której Dev mógł wprowadzać przyrostowe zmiany w schemacie, a zmiany te musiały być udokumentowane w CVS i zaproponowane do życia wraz z dodatkami do jednego z kilku „statycznych” stoły Zrobiliśmy to, mając trzecią bazę danych o nazwie Cruise, która zawierała tylko dane statyczne. W dowolnym momencie można porównać schemat z Dev i Cruise, a my mieliśmy skrypt, aby pobrać różnicę między tymi 2 plikami i stworzyć plik SQL zawierający instrukcje ALTER, aby go zastosować. Podobnie wszelkie nowe dane, może być destylowany do pliku SQL zawierającego polecenia INSERT. Tak długo, jak pola i tabele są tylko dodawane i nigdy nie usuwane, proces może zautomatyzować generowanie instrukcji SQL w celu zastosowania delty.

Wywoływany jest mechanizm, za pomocą którego git generuje delty difforaz mechanizm, za pomocą którego łączy on 1 lub więcej delt z plikiem merge. Jeśli potrafisz wymyślić metodę różnicowania i łączenia z innego kontekstu, git powinien działać, ale jak już wspomniano, możesz preferować narzędzie, które robi to za Ciebie. Moją pierwszą myślą o rozwiązaniu problemu jest https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools, który szczegółowo opisuje sposób zastąpienia wewnętrznego diff gita i narzędzie do scalania. Zaktualizuję tę odpowiedź, ponieważ wymyślę lepsze rozwiązanie problemu, ale w moim przypadku spodziewam się, że będę musiał jedynie zarządzać zmianami danych, o ile do tej pory plik bazy danych oparty na bazie danych może się zmienić, więc moje rozwiązanie może nie być dokładnie tym, czego potrzebujesz.


3

Spójrz na RedGate SQL Source Control.

http://www.red-gate.com/products/sql-development/sql-source-control/

To narzędzie jest przystawką SQL Server Management Studio, która pozwala umieścić bazę danych pod kontrolą źródła za pomocą Git.

Jest to trochę drogie i kosztuje 495 USD za użytkownika, ale dostępny jest 28-dniowy bezpłatny okres próbny.

UWAGA Nie jestem w żaden sposób powiązany z RedGate.


3

Chcę zrobić coś podobnego, dodać zmiany w bazie danych do mojego systemu kontroli wersji.

Zamierzam podążać za pomysłami zawartymi w tym poście od Vladimira Khorikova „Najlepsze praktyki w zakresie wersjonowania baz danych” . Podsumowując będę

  • przechowuj zarówno jego schemat, jak i dane referencyjne w systemie kontroli źródła.
  • dla każdej modyfikacji tworzymy osobny skrypt SQL ze zmianami

Jeśli to pomoże!


3
  • Irmin
  • Flur.ee
  • Crux DB

Od jakiegoś czasu szukałem tej samej funkcji dla Postgres (lub ogólnie baz danych SQL), ale nie znalazłem wystarczających narzędzi (prostych i intuicyjnych). Wynika to prawdopodobnie z binarnego charakteru przechowywania danych. Klonio brzmi idealnie, ale wygląda na martwego. Noms DB wygląda interesująco ( i żyje ). Zobacz także Irmin (oparty na OCaml z Git-właściwościami).

Chociaż to nie odpowiada na pytanie, ponieważ działałoby to z Postgres, sprawdź bazę danych Flur.ee. Ma funkcję „podróży w czasie”, która pozwala wyszukiwać dane z dowolnego punktu w czasie. Domyślam się, że powinien być w stanie pracować z modelem „rozgałęziającym się”.

Ta baza danych została niedawno opracowana do celów blockchain. Ze względu na charakter łańcuchów blokowych dane muszą być rejestrowane przyrostowo, dokładnie tak działa git. Ich celem jest wydanie open source w drugim kwartale 2019 r .

Ponieważ każda baza danych Fluree jest łańcuchem bloków, przechowuje całą historię każdej przeprowadzonej transakcji. Jest to część tego, jak blockchain zapewnia, że ​​informacje są niezmienne i bezpieczne .

Aktualizacja : sprawdź także bazę danych Crux , która może wyszukiwać w wymiarach czasowych wstawek, które możesz zobaczyć jako „wersje”. Crux wydaje się być implementacją wysoko ocenianego Datomica.

Crux to bitemporalna baza danych, która przechowuje czas transakcji i ważne historie czasu. Podczas gdy [uni] baza danych czasowych umożliwia zapytania o „podróż w czasie” poprzez sekwencję transakcji stanów bazy danych od momentu utworzenia bazy danych do jej aktualnego stanu, Crux zapewnia również zapytania o „podróż w czasie” dla dyskretnej prawidłowej osi czasu bez niepotrzebnej złożoności projektu lub wpływ na wydajność. Oznacza to, że użytkownik Crux może zapełnić bazę danych przeszłymi i przyszłymi informacjami bez względu na kolejność, w jakiej informacje te docierają, i wprowadzić poprawki do poprzednich nagrań, aby zbudować ciągle udoskonalany model czasowy danej domeny.


2

Nie można tego zrobić bez atomowości i nie można uzyskać atomowości bez użycia pg_dump lub systemu plików migawek.

Moja instancja postgres znajduje się na ZFS, którą od czasu do czasu wykonuję migawkę. Jest w przybliżeniu natychmiastowy i spójny.


2

To, czego chcesz, w duchu, może być coś takiego jak Post Facto , który przechowuje wersje bazy danych w bazie danych. Sprawdź tę prezentację .

Projekt najwyraźniej nigdzie nie poszedł, więc prawdopodobnie nie pomoże ci natychmiast, ale jest to ciekawa koncepcja. Obawiam się, że prawidłowe wykonanie tej czynności byłoby bardzo trudne, ponieważ nawet wersja 1 musiałaby poprawnie wyszczególnić wszystkie szczegóły, aby ludzie ufali swojej pracy.


2

Wydałem narzędzie do sqlite, które robi to, o co prosisz. Używa niestandardowego sterownika różnicowego wykorzystującego narzędzie do projektów sqlite „sqldiff”, UUID jako klucze podstawowe i pozostawia sqlite rowid. Nadal jest w fazie alfa, więc docenia się opinie.

Postgres i mysql są trudniejsze, ponieważ dane binarne są przechowywane w wielu plikach i mogą nawet nie być poprawne, jeśli można je wykonać migawkę.

https://github.com/cannadayr/git-sqlite


Wygląda na to, że pozwalasz gitowi przechowywać dane binarne takimi, jakie są. Zamiast tego można użyć filtrów czyszczenia / rozmazywania do przechowywania zrzutów. Jest kilka skryptów, które to robią.
max630

1
Przyzwoite podejście, z wyjątkiem sytuacji, gdy różnicujesz dwa stany bazy danych, wykonujesz różnicę tekstową zrzutu. Używając sqldiff jako niestandardowego sterownika różnicowego, otrzymujesz rzeczywiste polecenia mutacji bazy danych do następnego stanu.
cannadayr

1

Myślę, że X-Istence jest na dobrej drodze, ale jest jeszcze kilka ulepszeń w tej strategii. Pierwsze użycie:

$pg_dump --schema ... 

aby zrzucić tabele, sekwencje itp. i umieścić ten plik pod kontrolą wersji. Użyjesz tego do oddzielenia zmian kompatybilności między swoimi oddziałami.

Następnie wykonaj zrzut danych dla zestawu tabel, które zawierają konfigurację wymaganą do działania aplikacji (prawdopodobnie powinny pomijać dane użytkownika itp.), Takie jak ustawienia domyślne formularza i inne dane niemodyfikowalne przez użytkownika. Możesz to zrobić wybiórczo, używając:

$pg_dump --table=.. <or> --exclude-table=..

Jest to dobry pomysł, ponieważ repo może być naprawdę niezgrabne, gdy baza danych osiągnie 100 Mb + podczas pełnego zrzutu danych. Lepszym pomysłem jest utworzenie kopii zapasowej bardziej minimalnego zestawu danych wymaganych do przetestowania aplikacji. Jeśli dane domyślne są bardzo duże, może to jednak powodować problemy.

Jeśli absolutnie potrzebujesz umieścić pełne kopie zapasowe w repozytorium, rozważ zrobienie tego w gałęzi poza drzewem źródłowym. Zewnętrzny system tworzenia kopii zapasowych z pewnymi odniesieniami do pasującej wersji svn rev jest jednak prawdopodobnie najlepszy do tego.

Sugeruję również użycie zrzutów formatu tekstowego nad plikami binarnymi do celów rewizji (przynajmniej dla schematu), ponieważ łatwiej je rozróżnić. Zawsze możesz je skompresować, aby zaoszczędzić miejsce przed odprawą.

Na koniec zajrzyj do dokumentacji kopii zapasowej Postgres, jeśli jeszcze tego nie zrobiłeś. Sposób, w jaki komentujesz tworzenie kopii zapasowej „bazy danych” zamiast zrzutu, sprawia, że ​​zastanawiam się, czy myślisz o kopiach zapasowych opartych na systemie plików (więcej informacji znajduje się w sekcji 23.2 ).


czy zrzut nie jest tylko kopią zapasową?
hasen

Tak, ale możesz przywrócić ją do alternatywnej bazy danych i dokonać tam modyfikacji.
Dana the Sane

1

Odpowiedź na to pytanie jest w większości przypadków, ale chciałbym uzupełnić odpowiedź X-Istence i Dana the Sane drobną sugestią.

Jeśli potrzebujesz kontroli wersji z pewnym stopniem szczegółowości, powiedzmy codziennie, możesz połączyć zrzut tekstu zarówno tabel, jak i schematu za pomocą narzędzia takiego jak rdiff-backup które wykonuje przyrostowe kopie zapasowe. Zaletą jest to, że zamiast przechowywać migawki codziennych kopii zapasowych, po prostu przechowujesz różnice z poprzedniego dnia.

Dzięki temu masz zarówno zaletę kontroli wersji, jak i nie marnujesz zbyt wiele miejsca.

W każdym razie używanie git bezpośrednio na dużych płaskich plikach, które zmieniają się bardzo często, nie jest dobrym rozwiązaniem. Jeśli baza danych stanie się zbyt duża, git zacznie mieć problemy z zarządzaniem plikami.


1

Oto, co próbuję zrobić w moich projektach:

  • oddzielne dane i schemat oraz dane domyślne.

Konfiguracja bazy danych jest przechowywana w pliku konfiguracyjnym, który nie jest pod kontrolą wersji (.gitignore)

Domyślne ustawienia bazy danych (do konfigurowania nowych projektów) to prosty plik SQL pod kontrolą wersji.

Dla schematu bazy danych utwórz zrzut schematu bazy danych pod kontrolą wersji.

Najczęstszym sposobem jest posiadanie skryptów aktualizacji zawierających instrukcje SQL (ALTER Table .. lub UPDATE). Musisz także mieć miejsce w bazie danych, w którym zapiszesz bieżącą wersję schematu)

Spójrz na inne duże projekty baz danych typu open source (piwik lub twój ulubiony system cms), wszystkie używają skryptów aktualizacyjnych (1.sql, 2.sql, 3.sh, 4.php.5.sql)

Ale to bardzo czasochłonne zadanie, musisz utworzyć i przetestować skrypty aktualizacyjne, a także uruchomić wspólny skrypt aktualizacyjny, który porównuje wersję i uruchomić wszystkie niezbędne skrypty aktualizacyjne.

Więc teoretycznie (i tego właśnie szukam) możesz zrzucić schemat bazy danych po każdej zmianie (ręcznie, conjob, git hooks (być może przed zatwierdzeniem)) (i tylko w niektórych bardzo szczególnych przypadkach twórz skrypty aktualizacji)

Następnie we wspólnym skrypcie aktualizacji (uruchom zwykłe skrypty aktualizacji, w szczególnych przypadkach), a następnie porównaj schematy (zrzut i bieżąca baza danych), a następnie automatycznie wygeneruj niepotrzebne instrukcje ALTER. Istnieją narzędzia, które potrafią to zrobić, ale jeszcze nie znalazły dobrego.


1

Polecam neXtep do kontroli wersji bazy danych, która ma dobry zestaw dokumentacji i forów, które wyjaśniają sposób instalacji i napotkane błędy. Przetestowałem go dla postgreSQL 9.1 i 9.3, udało mi się go uruchomić dla wersji 9.1, ale dla wersji 9.3 nie działa.


@Nickolay Tak, wygląda na to, że przestało istnieć. Alternatywnie, dlaczego nie spróbujesz Skitch, znajdziesz go tutaj sqitch.org
Jerry M Sunny

Dzięki, sprawdzę to!
Nickolay

1

W moich osobistych projektach przechowuję całą bazę danych w Dropbox, a następnie wskazuję przepływ pracy MAMP, WAMP, aby móc z niej korzystać od razu. W ten sposób baza danych jest zawsze aktualna tam, gdzie muszę trochę popracować. Ale to tylko dla deweloperów! Witryny na żywo używają własnego serwera do tego oczywiście! :)


1

Przechowywanie każdego poziomu zmian w bazie danych pod kontrolą wersji git jest jak wypychanie całej bazy danych przy każdym zatwierdzeniu i przywracanie całej bazy danych przy każdym pociągnięciu. Jeśli twoja baza danych jest tak podatna na kluczowe zmiany i nie możesz sobie pozwolić na ich utratę, możesz po prostu zaktualizować haczyki poprzedzające polecenie i post_merge . Zrobiłem to samo z jednym z moich projektów, a wskazówki znajdziesz tutaj .


1

Tak to robię:

Ponieważ masz swobodę wyboru typu DB, użyj DB opartej na plikach, np. Firebird.

Utwórz szablon bazy danych, który ma schemat, który pasuje do Twojego rzeczywistego oddziału i zapisz go w repozytorium.

Podczas wykonywania aplikacji programowo utwórz kopię szablonu DB, zapisz ją w innym miejscu i po prostu pracuj z tą kopią.

W ten sposób możesz poddać schemat DB kontroli wersji bez danych. A jeśli zmienisz schemat, wystarczy zmienić szablon DB


1

Kiedyś prowadziliśmy serwis społecznościowy w standardowej konfiguracji LAMP. Mieliśmy serwer Live, serwer testowy i serwer programistyczny, a także maszyny lokalnych programistów. Wszystkie były zarządzane za pomocą GIT.

Na każdym komputerze mieliśmy pliki PHP, ale także usługę MySQL i folder z obrazami, które użytkownicy mogliby wgrać. Serwer Live powiększył się o około 100 000 (!) Użytkowników cyklicznych, zrzut miał około 2 GB (!), Folder obrazu miał około 50 GB (!). Zanim wyszedłem, nasz serwer osiągał limit swojego procesora, pamięci RAM, a przede wszystkim równoczesnych limitów połączeń sieciowych (skompilowaliśmy nawet własną wersję sterownika karty sieciowej, aby maksymalnie wydłużyć serwer „lol”). Nie mogliśmy ( i nie należy zakładać, że na swojej stronie internetowej) ), że w GIT umieszczono 2 GB danych i 50 GB zdjęć.

Aby łatwo zarządzać tym wszystkim w GIT, zignorowalibyśmy foldery binarne (foldery zawierające obrazy), wstawiając ścieżki folderów do .gitignore. Mieliśmy również folder o nazwie SQL poza ścieżką do katalogu dokumentów Apache. W tym folderze SQL umieścilibyśmy nasze pliki SQL od programistów w przyrostowych numeracjach (001.florianm.sql, 001.johns.sql, 002.florianm.sql itp.). Te pliki SQL były również zarządzane przez GIT. Pierwszy plik sql rzeczywiście zawierałby duży zestaw schematu DB. Nie dodajemy danych użytkownika w GIT (np. Rekordy tabeli użytkowników lub tabeli komentarzy), ale dane takie jak configs lub topologia lub inne dane specyficzne dla strony były przechowywane w plikach sql (a więc przez GIT). Głównie programiści (znający kod najlepiej) określają, co i co nie jest obsługiwane przez GIT w odniesieniu do schematu i danych SQL.

Gdy doszło do wydania, administrator loguje się na serwerze deweloperskim, łączy gałąź aktywną ze wszystkimi programistami i potrzebnymi gałęziami na komputerze deweloperskim do gałęzi aktualizacji i przekazuje ją na serwer testowy. Na serwerze testowym sprawdza, czy proces aktualizacji serwera Live jest nadal aktualny, a następnie szybko kieruje cały ruch w Apache do witryny zastępczej, tworzy zrzut bazy danych, wskazuje katalog roboczy z „na żywo” na „aktualizację” ', wykonuje wszystkie nowe pliki sql w mysql i przenosi ruch z powrotem do właściwej strony. Kiedy wszyscy interesariusze zgodzili się po przejrzeniu serwera testowego, Administrator zrobił to samo od serwera testowego do serwera Live. Następnie łączy działającą gałąź na serwerze produkcyjnym z gałęzią główną na wszystkich serwerach i ponownie bazuje wszystkie działające gałęzie.

Jeśli wystąpiły problemy na serwerze testowym, np. w połączeniach wystąpiło zbyt wiele konfliktów, następnie kod został cofnięty (wskazując działającej gałęzi z powrotem na „na żywo”) i pliki sql nigdy nie zostały wykonane. W momencie wykonania plików sql było to wówczas uważane za działanie nieodwracalne. Jeśli pliki SQL nie działały poprawnie, wówczas DB został przywrócony przy użyciu zrzutu (i programiści powiedzieli, że zapewnia źle przetestowane pliki SQL).

Obecnie utrzymujemy folder sql-up i sql-down z równoważnymi nazwami plików, w których programiści muszą przetestować, czy oba uaktualniane pliki sql mogą być równie obniżone. Można to ostatecznie wykonać za pomocą skryptu bash, ale to dobry pomysł, jeśli ludzkie oczy nadal monitorują proces aktualizacji.

To nie jest świetne, ale jest do opanowania. Mam nadzieję, że daje to wgląd w rzeczywistą, praktyczną stronę o stosunkowo wysokiej dostępności. Być może trochę przestarzałe, ale nadal podążać.


0

Użyj narzędzia, takiego jak iBatis Migrations ( instrukcja , krótki film instruktażowy ), który pozwala kontrolować zmiany w wersji wprowadzanych w bazie danych przez cały cykl życia projektu, a nie samej bazy danych.

Pozwala to na selektywne stosowanie pojedynczych zmian w różnych środowiskach, prowadzenie dziennika zmian, w których zmianach znajdują się poszczególne środowiska, tworzenie skryptów do stosowania zmian od A do N, zmian wycofywania zmian itp.


0

Chciałbym poddać całą bazę danych kontroli wersji, jakiego silnika bazy danych mogę użyć, aby móc przekazać aktualną bazę danych kontroli wersji zamiast zrzutu?

To nie zależy od silnika bazy danych. Microsoft SQL Server oferuje wiele programów do kontroli wersji. Nie sądzę, że problem można rozwiązać za pomocą git, musisz użyć systemu kontroli wersji schematu specyficznego dla pgsql. Nie wiem, czy coś takiego istnieje, czy nie ...


2
Naprawdę powinieneś rzucić okiem na klonio, które jest dostosowane do wersjonowania baz danych (obecnie obsługuje Mongo i MySQL). Nadal w fazie beta, ale wydaje się dość obiecujący.
farthVader

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.