Porównaj dwie bazy danych MySQL [zamknięte]

368

Obecnie tworzę aplikację przy użyciu bazy danych MySQL.

Struktura bazy danych wciąż się zmienia i zmienia się w trakcie rozwoju (zmieniam moją kopię lokalną, pozostawiając tę ​​samą na serwerze testowym).

Czy istnieje sposób na porównanie dwóch instancji bazy danych, aby sprawdzić, czy były jakieś zmiany?

Podczas gdy obecnie po prostu usunięcie poprzedniej bazy danych serwera testowego jest w porządku, ponieważ testowanie rozpoczyna się od wprowadzania danych testowych, może to być nieco trudne.
To samo, choć więcej, wydarzy się ponownie później w produkcji ...

Czy istnieje prosty sposób na stopniowe wprowadzanie zmian w produkcyjnej bazie danych, najlepiej poprzez automatyczne tworzenie skryptu do jej modyfikacji?


Narzędzia wymienione w odpowiedziach:

Vincent Ramdhanie
źródło
4
Wierzę, że narzędzia RedGate są tylko dla SQL Server.
Dave R.
4
Red Gate ma teraz również wersję MySQL, obecnie darmową, ponieważ jest w rozszerzonym wczesnym dostępie: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson
2
To prawdziwy problem. Wdrażam z dewelopera na maszynę produkcyjną i ZAWSZE coś psuje. Dziękuję za ten pouczający post
Herr
1
Narzędzie MySQL firmy Redgate kosztuje teraz 70 USD / użytkownika. Nawet w tej cenie ocenię i opublikuję komentarze tutaj.
Jeremy McGee,
Potrzebowałem tego właśnie teraz, musiałem zwiększyć rozmiar pola. Nie chciałem go tylko zwiększać i podejrzewać, że wszystko jest w porządku. @Jared zaproponował dokładnie to, czego użyłem.
Tass

Odpowiedzi:

210

Jeśli pracujesz z małymi bazami danych, zauważyłem, że uruchomiłem mysqldump na obu bazach danych z opcjami --skip-commentsi, --skip-extended-insertaby wygenerować skrypty SQL, a następnie uruchomienie diff na skryptach SQL działa całkiem dobrze.

Pomijając komentarze, unikniesz bezsensownych różnic, takich jak czas uruchomienia polecenia mysqldump. Za pomocą --skip-extended-insertpolecenia upewniasz się, że każdy wiersz jest wstawiany z własną instrukcją insert. Eliminuje to sytuację, w której pojedynczy nowy lub zmodyfikowany rekord może powodować reakcję łańcuchową we wszystkich przyszłych instrukcjach wstawiania. Uruchamianie z tymi opcjami powoduje większe zrzuty bez komentarzy, więc prawdopodobnie nie jest to coś, co chcesz zrobić w zastosowaniach produkcyjnych, ale w przypadku rozwoju powinno być dobrze. Poniżej zamieszczam przykłady poleceń, których używam:

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql
Jared
źródło
12
Podwójne plusy za znajomość wiersza poleceń !!!
dogenpunk
5
Aby porównać dane , użyj tego; wciąż będą komentarze MySQL4 + na temat zestawów znaków itp.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok
41
-d, --no-datamogą być interesujące dla tych, którzy potrzebują użycia produkcyjnego, ale dbają tylko o schemat
Louis
7
Lepszym narzędziem do użycia byłoby narzędzie mysqldbcompare opracowane przez MySQL, którego można używać w systemach Windows, Linux lub Mac - może również wyświetlać instrukcje SQL dla zmian danych ORAZ schematu i wykonuje o wiele więcej testów niż zwykły diff wiersza poleceń określać.
Jasdeep Khalsa
4
Aby uzyskać przyjemną vimdiff
różnicę
99

Toad dla MySQL ma funkcje porównywania danych i schematów i wierzę, że nawet stworzy skrypt synchronizacji. Najlepsze jest to, że jest darmowy.

Anson Smith
źródło
2
Wszystkie wymienione narzędzia wyglądają dobrze. Na razie wybieram Ropucha arbitralnie, dopóki nie będę mógł przeprowadzić więcej badań.
Vincent Ramdhanie
64
Podekscytowałem się tym narzędziem, dopóki nie zorientowałem się, że działa ono w systemie Windows, a nie w systemie Linux. Powrót do wyszukiwania ...
jdias
2
Działa dla mnie fantastycznie. Zrobiłem wszystko, co trzeba, a podświetlone komórki dla zmienionych rekordów ułatwiły sprawdzenie, co się zmieniło.
Thames,
4
mysqldbcompare z --run-all-tests --difftype sql --disable-binary-loggingopcjami może wykonać prawie to samo zadanie (z wyjątkiem tego, że dane wyjściowe są pomieszane z komentarzem, a znaki specjalne w ciągu nie są poprzedzane znakami ucieczki).
schemacs
4
@Anson Smith Czy możesz mi powiedzieć alternatywę dla systemu Linux?
Visruth,
20

Korzystam z oprogramowania o nazwie Navicat, aby:

  • Synchronizuj bazy danych Live z moimi testowymi bazami danych.
  • Pokaż różnice między dwiema bazami danych.

Kosztuje pieniądze, to tylko Windows i Mac, i ma niesamowity interfejs użytkownika, ale lubię to.

seanyboy
źródło
Działa w systemie Linux. W tej chwili mam to otwarte na innym pulpicie. Funkcja synchronizacji struktury umożliwiająca wypychanie zmian schematu z dev-> test-> live jest warta samej opłaty licencyjnej.
Pułkownik Sponsz
2
Niezły haczyk, nawet nie wiedziałem, że ma takie cechy. Jak dotąd najlepsza rzecz na Macu.
Hendra Uzia
Wydaje się, że porównuje tylko bazy danych, które działają na serwerach, a nie rodzime pliki SQL
AlxVallejo,
@seanyboy, Dlaczego podoba ci się ten dziwaczny interfejs użytkownika?
Pacerier
17

W SQLyog (komercyjnym) jest narzędzie do synchronizacji schematów, które generuje SQL do synchronizacji dwóch baz danych.

wprowadź opis zdjęcia tutaj

Jurij Litwinow
źródło
1
tak, to dla mnie najlepsze rozwiązanie do tej pory, zapewnia doskonałe zapytania synchronizacji SQL, dzięki czemu można je aktualizować w dowolnym miejscu i czasie ..
Anupam
zbyt drogie i ciężkie, nie nadaje się do łatania po fakcie
zanlok
1
Bardzo wolno iz jakiegoś powodu upuszcza i odtwarza wiele kluczy obcych, nawet jeśli nie są potrzebne. Nie ma możliwości śledzenia postępów.
Artem Goutsoul,
13

Z listy porównawczej funkcji ... MySQL Workbench oferuje Schema Diff i Schema Synchronization w swoim wydaniu społecznościowym.

andyhky
źródło
7
Działa świetnie! I to za darmo, dzięki. Dla tych, którzy nie mogli go znaleźć (jak ja). Jest tutaj: Baza danych -> Inżynier odwrotny -> W modelu MySQL lub na schemacie EER -> Baza danych -> Synchronizuj z dowolnym źródłem
zgięty
Działa dobrze. Można jednak porównywać tylko bazy danych o tej samej nazwie. Mam wiele baz danych (klient wielu dzierżawców), które chcę synchronizować z wersją „master” na tym samym hoście. Dlatego przed synchronizacją muszę zmienić nazwę wzorca, aby pasowała do każdej bazy danych klienta. Poza tym miło!
scipilot
Dodatkowe informacje na ten temat można znaleźć pod tym linkiem
Steven Ryssaert
13

Z pewnością istnieje wiele sposobów, ale w moim przypadku wolę polecenie dump i diff. Oto skrypt oparty na komentarzu Jareda:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

Informacje zwrotne są mile widziane :)

develCuy
źródło
12

dbSolo, jest płatny, ale ta funkcja może być tą, której szukasz http://www.dbsolo.com/help/compare.html

Współpracuje z Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 i MySQL alternatywny tekst

jmpeace
źródło
właśnie tego dokładnie szukałem! Niesamowite!
Josh Nankin,
11

Jeśli potrzebujesz tylko porównać schematy (nie dane) i mieć dostęp do Perla, mysqldiff może działać. Użyłem go, ponieważ pozwala porównać lokalne bazy danych ze zdalnymi bazami danych (przez SSH), więc nie musisz zawracać sobie głowy zrzucaniem jakichkolwiek danych.

http://adamspiers.org/computing/mysqldiff/

Spróbuje wygenerować zapytania SQL w celu zsynchronizowania dwóch baz danych, ale nie ufam temu (ani żadnemu narzędziu, właściwie). O ile mi wiadomo, nie ma w 100% niezawodnego sposobu na przeprowadzenie inżynierii wstecznej zmian potrzebnych do przekonwertowania jednego schematu bazy danych na inny, szczególnie gdy wprowadzono wiele zmian.

Na przykład, jeśli zmienisz tylko typ kolumny, zautomatyzowane narzędzie może łatwo odgadnąć, jak je odtworzyć. Ale jeśli również przeniesiesz kolumnę, zmienisz jej nazwę i dodasz lub usuniesz inne kolumny, najlepsze, co może zrobić każdy pakiet oprogramowania, to zgadnij, co prawdopodobnie się wydarzyło. I możesz stracić dane.

Sugeruję śledzenie wszelkich zmian schematu, które wprowadzasz na serwerze programistycznym, a następnie ręczne uruchamianie tych instrukcji na serwerze na żywo (lub włączenie ich do skryptu aktualizacji lub migracji). Jest to bardziej nużące, ale zapewni bezpieczeństwo danych. A zanim zaczniesz zezwalać użytkownikom końcowym na dostęp do Twojej witryny, czy naprawdę będziesz dokonywał ciągłych, ciężkich zmian w bazie danych?

Zac
źródło
Nie zapomnij, aby zapewnić zarówno --hostNi --userNczy będzie to nie cicho.
Znarkus
Miałem problem z narzędziami mysqldbcompare firmy Oracle generującymi błędy w indeksach i zmieniającymi pola, które były równoważne. Narzędzie mysqldiff działało bezbłędnie i oszczędzało sporo czasu.
Robert K
6

sprawdź: http://schemasync.org/ narzędzie schemasync działa dla mnie, to narzędzie wiersza poleceń działa łatwo w wierszu poleceń systemu Linux

likeuclinux
źródło
1
Jeśli masz problemy z instalacją tego na komputerze Mac, mogłem to zrobić, instalując mysql i python za pomocą homebrew, bez pomocy Macports.
Bijou Trouvaille
3

Istnieje przydatne narzędzie napisane przy użyciu perla o nazwie Maatkit . Ma wiele narzędzi do porównywania i synchronizacji baz danych.

Jarod Elliott
źródło
Nie wiedziałem o tym projekcie! Dzięki, wygląda na to, że ma sporo narzędzi, które byłyby bardzo przydatne.
Vincent Ramdhanie
2
Nie znalazłem narzędzi do porównywania schematów w Maatkit.
stepancheg
Ja też - gdzie w narzędziach możemy to znaleźć?
Shabbyrobe
Nie sądzę, że jest tam porównanie schematu. Miałem na myśli porównanie danych i synchronizację za pomocą sumy kontrolnej mk-table i mk-table-sync
Jarod Elliott,
3

Dla mnie zacznę od zrzucania obu baz danych i różnicowania zrzutów, ale jeśli chcesz automatycznie generować skrypty scalające, będziesz chciał zdobyć prawdziwe narzędzie.

Prosta wyszukiwarka Google wykazała następujące narzędzia:

Craig Trader
źródło
3

Spójrz na dbForge Data Compare dla MySQL . To shareware z 30-dniowym bezpłatnym okresem próbnym. Jest to szybkie narzędzie GUI MySQL do porównywania i synchronizacji danych, zarządzania różnicami danych i dostosowywania synchronizacji.

dbForge Data Compare dla MySQL

Devart
źródło
3

Po wielu godzinach szukania w Internecie prostego narzędzia zdałem sobie sprawę, że nie zajrzałem do Centrum oprogramowania Ubuntu. Oto bezpłatne rozwiązanie, które znalazłem: http://torasql.com/ Podobno mają też wersję dla Windows, ale używam jej tylko pod Ubuntu.

Edycja: 2015-lut-05 Jeśli potrzebujesz narzędzia Windows, TOAD jest idealny i darmowy: http://software.dell.com/products/toad-for-mysql/

Nikołaj Iwanow
źródło
2
Rozwój tego narzędzia został zatrzymany i jest teraz zawarty w Percona
mrmuggles
2

Bardzo łatwe w użyciu narzędzie do porównywania i synchronizacji:
porównywarka baz danych http://www.clevercomponents.com/products/dbcomparer/index.asp

Zalety:

  • szybki
  • łatwy w użyciu
  • łatwe do wyboru zmiany do zastosowania

Niedogodności:

  • nie synchronizuje długości z małymi liczbami całkowitymi
  • nie synchronizuje poprawnie nazw indeksów
  • nie synchronizuje komentarzy
Artem Goutsoul
źródło
To prawda, że ​​dokonali powierzchownej aktualizacji z kilkoma małymi zmianami w ciągu 5 lat. Ale nie jest aktywnie rozwijany.
Artem Goutsoul
1

Myślę, że Navicat dla MySQL będzie pomocny w tym przypadku. Obsługuje synchronizację danych i struktury dla MySQL. wprowadź opis zdjęcia tutaj


źródło
0

W pierwszej części pytania po prostu zrzucam oba i różnicuję je. Nie jestem pewien co do mysql, ale postgres pg_dump ma polecenie, aby po prostu zrzucić schemat bez zawartości tabeli, dzięki czemu można sprawdzić, czy schemat został zmieniony.

Paul Tomblin
źródło
MySQL ma podobne polecenie mysql_dump. To może być rozwiązanie, gdybym mógł zintegrować to z procesem wdrażania. Dzięki.
Vincent Ramdhanie
Ponadto, aby uzyskać bardziej przyjazną obsługę, możesz uzyskać to samo za pomocą phpMyAdmin - prawdziwego zabójcy dla użytkowników MySQL!
schonarth
Identyczne schematy mogą łatwo doprowadzić do różnych zrzutów schematu. Różne wersje klienta mysql mogą generować nieco inne zrzuty (problem, jeśli porównujesz schematy z dwóch różnych komputerów), a rzeczy takie jak klucze obce i ograniczenia mogą być zrzucane w innej kolejności.
Mark E. Haase,
0

Współpracuję z zespołem marketingowym Nob Hill, chciałem powiedzieć, że z przyjemnością usłyszę twoje pytania, sugestie lub cokolwiek innego, prosimy o kontakt.

Początkowo zdecydowaliśmy się stworzyć nasze narzędzie od zera, ponieważ chociaż istnieją inne takie produkty na rynku, żadne z nich nie spełnia swojej roli. Bardzo łatwo jest pokazać różnice między bazami danych. To zupełnie inna rzecz, aby stworzyć jedną bazę danych taką jak druga. Płynna migracja zarówno schematu, jak i danych zawsze była wyzwaniem. Osiągnęliśmy to tutaj.
Jesteśmy tak pewni, że może zapewnić płynną migrację, niż gdyby nie - jeśli generowane przez nią skrypty migracji nie będą wystarczająco czytelne lub nie będą działać, a my nie możemy tego naprawić w ciągu pięciu dni roboczych - dostaniesz swój własny bezpłatny egzemplarz!

http://www.nobhillsoft.com/NHDBCompare.aspx


źródło
czy to obietnica? Wypróbowałem to i przewróciło się z dość kilkoma błędami, zwłaszcza że podczas migracji funkcji próbuje użyć tego samego właściciela co oryginalna baza danych
Cruachan
Tak, to obietnica. Dla większości ludzi narzędzie działa dobrze. Obiecujemy dożywotnią licencję na każdy znaleziony błąd i nie możemy go naprawić w ciągu 5 dni roboczych. Skontaktuj się z naszym zespołem pomocy technicznej.