Synchronizacja bazy danych między programowaniem / etapowaniem a produkcją

36

Mam problem z synchronizacją bazy danych WordPress między programowaniem a produkcją i zastanawiam się, jak inni ludzie ją rozwiązują. Mam świadomość tego pytania, ale tak naprawdę nie obejmuje ono bardziej nieprzyjemnego i bardziej realistycznego przypadku użycia.

Załóżmy, że mam witrynę WordPress na żywo. Zrobiłem zrzut wszystkiego, powielając to w naszym środowisku programistycznym. Zacząłem wprowadzać zmiany. Tydzień później jestem gotowy do wdrożenia moich aktualizacji. W międzyczasie baza danych na stronie produkcyjnej uległa zmianie (nowe posty, nowe komentarze itp.). Jak synchronizować zmiany między produkcją a rozwojem podczas wdrażania i czy można zautomatyzować (przynajmniej nieco) ten proces?

Alex
źródło
Wypróbuj tę wtyczkę wordpress.org/extend/plugins/duplicator
Gopal Bhattacharjee

Odpowiedzi:

10

Może istnieć lepszy sposób, za którym tęsknię, ale dam wam 2 opcje:

1. Użyj Eksportu XML, aby wyeksportować nowe posty i komentarze. Następnie użyj importera WordPress, aby zaimportować nowe posty i komentarze z powrotem do bazy danych deweloperów

Najlepiej jest zaimportować do dev, a następnie przenieść bazę danych do produkcji, ponieważ po zaimportowaniu pobierze wszystkie nowe pliki multimedialne z produkcji.

W międzyczasie produkcja uległa zmianie (nowe posty, nowe komentarze itp.)

To rozwiązałoby problem z wprowadzaniem dowolnych zmienionych treści.

2. Użyj polecenia INSERT IGNORE INTO MySql, aby dodać nowe tabele z dev. lub polecenie REPLACE, aby zastąpić zduplikowane wiersze w tej samej tabeli.

Przed użyciem MySql wykonaj kopię zapasową obu baz danych i przenieś bazę danych gz na serwer produkcyjny i prześlij zrzut (zmień nazwę dev, jeśli jest taka sama jak produkcyjna).

INSERT IGNORE INTO `_wp_production_db`.`wp_cool_plugin_options`
SELECT *
FROM `_wp_dev_db`.`wp_cool_plugin_options`

Nie czuję się dobrze z poleceniami MySql, więc wybrałbym opcję 1.

Chris_O
źródło
zauważ, że gdzieś eksportuje XML z ilością postów, np. na moim blogu +10 000 postów Nie mogę go użyć.
edelwater
@edelwater, tak, to zależy od ustawień serwera dla max_execution_time (zwykle 30 sekund), w przypadku bardzo dużych eksportów wartość ta musi być ustawiona na wyższą wartość (1-2 minuty lub więcej)
mike23
2

Jeśli chodzi tylko o dokładnie ten sam typ danych (niektóre nowe wpisy na blogu, nowe komentarze), nie jestem pewien, dlaczego tak naprawdę chcesz je zsynchronizować. To nie tak, że zmieni sposób działania kodu na stronie, ponieważ jest to po prostu to samo. Zwykle nie przejmuję się tym, chyba że jest to nowy typ danych.

Po prostu zawsze upewniam się, że mam dobrą próbkę danych dla witryny, nie każdy post, strona, komentarz z witryny na żywo.

Curtismchale
źródło
2
Słuszna uwaga! Jeśli jednak w produkcji wprowadzono pewne zmiany w obszarze czysto treściowym (posty, komentarze), a programista wprowadził zmiany w ustawieniach i konfiguracji powiedzeń (na przykład dodał 5 wtyczek i poprawił ich ustawienia), w jaki sposób można przenieść te zmiany ustawień bez wykonywania pracy dwukrotnie (jedna czas na programistę i jeden na produkcję)?
Alex
to jest prawdziwe pytanie, prawda? Nie mam na to odpowiedzi.
curtismchale
-1. Czasami musimy je synchronizować. Specjalnie dla posta / stron idz bazy danych.
Francisco Corrales Morales,
2

Gdy tylko dotkniesz tematu robienia zmian równolegle, dotkniesz obszaru zarządzania konfiguracją. Z wieloma wzorami, własnymi społecznościami (http://www.cmcrossroads.com/) i narzędziami nie tyle do zarządzania wersjami (jak svn / git), ale do obsługi zarządzania konfiguracją (wzorce), jak na przykład clearcase. (zupełnie inne obszary).

W tym przypadku jest to nadal prosta sytuacja i znajdziesz ją z pewnymi ograniczeniami i pracą ręczną oraz niektórymi listami.

Scenariusz, który zamierzam uczynić bardziej opisowym dla idealnego rozwiązania: wielu programistów pracujących na tej samej bazie kodu, wiele środowisk testowych, wiele środowisk akceptacji, wiele środowisk akceptacji produkcji, prawdopodobnie we wszystkich zakątkach świata.

Jeśli chcesz to zrobić nieco bardziej profesjonalnie:

a) zapisz listę wszystkich elementów konfiguracji, które napotkasz, może to być sam kod WordPress, wtyczki z elementów zewnętrznych, treść, metadane i zdecyduj, które z nich chcesz objąć jakimś „zarządzaniem”, które mają znaczenie.

b) opisać przepływy pracy, które mogą się zdarzyć, np. co dzieje się z poprawką, co dzieje się z rozwojem czegoś nowego, w jakim przypadku zmieniasz treść po swojej stronie, co się nazywa i kto to robi, kto jest jej właścicielem np. nowy post lub nowa wtyczka.

c) w przypadku pracy równoległej najpierw opisz, z którymi elementami CI chcesz zarządzać, zdecyduj, czy przepływ zawsze przebiega od rozwoju do produkcji, czy też naprawdę jest to konieczne na dwa sposoby.

d) dla każdego z typów CI w punkcie (a) napisz uchwałę. Np. Dla WSZYSTKICH, które są tekstem (lub eksportowanym tekstem, takim jak pliki php, ale TAKŻE zwykły tekst w plikach XML), scalanie jest możliwe. To naprawdę nie jest problem, ale potrzebujesz dobrego narzędzia do scalania. np. z ClearCase uzyskasz w 3 sposób połączenie następujących sytuacji: 1) trywialne scalenia: zrobi to automatycznie 2) nietrywialne automatyczne: zrobi to automatycznie ALE musisz to sprawdzić 3) nie trywialne nieautomatyczne: to jest konfliktem, np. w 1 linii wprowadzono kilka zmian. Nie trywialne to minimalna część, o którą musisz dbać ręcznie, dobre narzędzie do łączenia poprowadzi Cię w tym np. Jedno w przejrzystej (które również łączy słowa i gdzie można połączyć w inne komercyjne lub niekomercyjne połączenia dla określonego pliku typy). Ponadto, jeśli zidentyfikowałeś w (a) plikach, które powinny być tylko kopiowane, to ich zachowanie nie byłoby scalane, ale po prostu kopiowane w jeden sposób, zastępując inną wersję bez scalania (np. Wtyczki, których nie zmodyfikowałeś). Wiele z tych typów jest możliwych przy różnych zachowaniach. Ale zapisz relacje między CI,

Następnie w przypadku połączeń nie opartych na tekście musisz podjąć decyzję, jak sobie z nimi poradzić, np. Obrazy, które zostały zmienione w 2 miejscach. Można tu zdecydować, że produkcja zawsze ma pierwszeństwo (przynajmniej tak sądzę), co czyni to prostym.

Więc ... aby rozwiązać ten problem, potrzebujesz narzędzia do zarządzania wersjami, które obsługuje różne strumienie. Każdy strumień reprezentowałby jedną część. (może to być niezwykle skomplikowane w zależności od potrzeb, ale w tym przypadku uważam, że jest to bardzo proste).

Jeśli możesz teraz mieć te strumienie pod sobą, instalacje WordPress i zsynchronizować je również z zawartością bazy danych itp., Możesz wykonać scalenia w narzędziu CM / wersjonowania, a następnie wyeksportować je z powrotem do innego środowiska.

Chodzi o to, że ... musisz to najpierw zapisać. To nie jest techniczny hack. Jest to domyślny wzorzec zarządzania konfiguracją, więc nie ma w tym nic dziwnego, ale trzeba go zapisać. Może się okazać, że np. Zainstalowana wtyczka wprowadza zmiany w bazie danych przy użyciu niektórych danych, które są inne w innym środowisku, dlatego musisz mieć dodatkową procedurę wokół tego.

Technicznie prawie zawsze wszystko jest możliwe, sprawdź http://www.cmcrossroads.com/forums w przypadku scenariuszy, które są dziesiątki lub setki razy bardziej skomplikowane, ale zawsze przy użyciu tego samego podejścia i tego samego zestawu wzorców CM.

w skrócie: umieść pod nią warstwę zarządzania wersjami, zautomatyzuj scalanie i rozwiąż konflikty, a następnie zaimportuj w środowisku docelowym. Wymyśl odpowiednią dla siebie strategię strumieniową i zapisz ją. Wykonaj małe zarządzanie bitami CM. To byłoby profesjonalne rozwiązanie, w przeciwnym razie zainstaluj hack kopiowania db, skrypty itp ...

Edelwater
źródło
2

Właśnie napisałem post o tym, jak zsynchronizować dane produkcyjne z naszą inscenizacją, sprawdź mój post na blogu na ten temat: http://blog.wp.weightpoint.se/2012/01/04/synchronizing-wordpress-multisite-database -z-produkcji-do-inscenizacji-środowiska /

Jeśli chcesz zsynchronizować kod i inne rzeczy, zaleciłbym utworzenie repozytorium git lub merkurialnego z odpowiednim plikiem ignorowania.

Jeśli chcesz wprowadzić aktualizacje różnicowe, aby produkować od etapu, myślę, że tworzenie skryptów migracji jest najbezpieczniejszym i najlepszym sposobem.

Niklas
źródło