Confronta due database MySQL [chiuso]


368

Attualmente sto sviluppando un'applicazione usando un database MySQL.

La struttura del database è ancora in evoluzione e cambia mentre lo sviluppo procede (cambio la mia copia locale, lasciando solo quella sul server di test).

C'è un modo per confrontare le due istanze del database per vedere se ci sono state delle modifiche?

Mentre attualmente è sufficiente scartare il database del server di test precedente, poiché i test iniziano a immettere i dati di test, potrebbe essere un po 'complicato.
Lo stesso anche se accadrà di più più avanti nella produzione ...

Esiste un modo semplice per apportare in modo incrementale modifiche al database di produzione, preferibilmente creando automaticamente uno script per modificarlo?


Strumenti citati nelle risposte:


4
Credo che gli strumenti di RedGate siano solo per SQL Server.
Dave R.,

4
Red Gate ora ha anche una versione MySQL, attualmente gratuita in quanto è in accesso anticipato esteso: red-gate.com/products/MySQL_Compare/index.htm
David Atkinson,

2
È un vero problema Distribuisco dallo sviluppatore alla macchina di produzione e si rompe SEMPRE qualcosa. Grazie per questo post informativo
Herr

1
Lo strumento MySQL di Redgate è ora $ 70 / utente. Anche a quel prezzo valuterò e pubblicherò commenti qui.
Jeremy McGee,

Anche questo aveva bisogno proprio ora, doveva aumentare la dimensione di un campo. Non volevo solo aumentarlo e sospettare che tutto fosse a posto. @Jared mi ha suggerito esattamente quello che ho usato.
Tass

Risposte:


210

Se stai lavorando con piccoli database ho scoperto che eseguire mysqldump su entrambi i database con le opzioni --skip-commentse --skip-extended-insertper generare script SQL, quindi eseguire diff sugli script SQL funziona abbastanza bene.

Saltando i commenti si evitano differenze insignificanti come il tempo in cui è stato eseguito il comando mysqldump. Usando il --skip-extended-insertcomando si assicura che ogni riga sia inserita con la propria istruzione insert. Ciò elimina la situazione in cui un singolo record nuovo o modificato può causare una reazione a catena in tutte le future istruzioni insert. L'esecuzione con queste opzioni produce dump più grandi senza commenti, quindi questo probabilmente non è qualcosa che si desidera fare nell'uso della produzione, ma per lo sviluppo dovrebbe andare bene. Ho messo esempi dei comandi che utilizzo di seguito:

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

12
Doppi voti positivi per l'alfabetizzazione da riga di comando !!!
dogenpunk,

5
Per confrontare i dati , utilizzare questo; restano ancora alcuni commenti su MySQL4 + sui set di caratteri, ecc.mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok,

41
-d, --no-datapotrebbe essere di interesse per coloro che necessitano di un uso produttivo, ma si preoccupano solo dello schema
Louis,

7
Uno strumento migliore da utilizzare sarebbe l' utilità mysqldbcompare sviluppata dagli stessi MySQL che è possibile utilizzare su Windows, Linux o Mac: può anche generare istruzioni SQL sia per i cambiamenti di dati che di schema e fare molti più test di quanto potrebbe fare una semplice diff della riga di comando determinare.
Jasdeep Khalsa,

4
Per una bella differenza con i colori, provavimdiff
gitaarik,

99

Toad per MySQL ha funzionalità di confronto di dati e schemi e credo che creerà persino uno script di sincronizzazione. Soprattutto, è freeware.


2
Tutti gli strumenti citati sembrano buoni. Sto selezionando Toad in modo arbitrario per ora fino a quando potrei condurre qualche ricerca in più.
Vincent Ramdhanie,

64
Mi sono emozionato per questo strumento fino a quando ho capito che funziona su Windows, non su Linux. Torna alla ricerca ...
jdias,

2
Ha funzionato alla grande per me. Ha fatto tutto ciò di cui avevo bisogno e le celle evidenziate per i record modificati hanno reso facile vedere cosa è cambiato.
Tamigi,

4
mysqldbcompare con le --run-all-tests --difftype sql --disable-binary-loggingopzioni può fare quasi lo stesso lavoro (tranne per il fatto che l'output è mescolato con il commento e non vengono salvati caratteri speciali nella stringa).
Schemacs,

4
@Anson Smith Puoi dirmi l'alternativa per Linux?
Visruth,

20

Uso un software chiamato Navicat per:

  • Sincronizza i database Live con i miei database di test.
  • Mostra le differenze tra i due database.

Costa denaro, è solo Windows e Mac, e ha una UI bizzarra, ma mi piace.


Funziona su Linux. L'ho aperto su un altro desktop al momento. La funzione di sincronizzazione della struttura per spingere le modifiche dello schema da dev-> test-> live vale solo il canone.
Colonnello Sponsz,

2
Bella cattura, non sapevo nemmeno che avesse quelle caratteristiche. Finora è la cosa migliore sul Mac.
Hendra Uzia,

Sembra confrontare solo database che vivono su server, non file sql nativi
AlxVallejo,

@seanyboy, perché ti piace l'interfaccia utente bizzarra?
Pacerier,

17

Esiste uno strumento di sincronizzazione dello schema in SQLyog (commerciale) che genera SQL per la sincronizzazione di due database.

inserisci qui la descrizione dell'immagine


1
sì, questa è la migliore soluzione finora per me, fornisce ottime query di sincronizzazione SQL in modo da poterlo aggiornare sempre e ovunque ..
Anupam

troppo costoso e pesante, non va bene per patch dopo il fatto
zanlok

1
Molto lento, e per qualche motivo cade e ricrea molte chiavi esterne anche quando non è necessario. Non c'è modo di seguire i progressi.
Artem Goutsoul

13

Dall'elenco di confronto delle funzionalità ... MySQL Workbench offre Schema Diff e Schema Synchronization nella loro edizione della community.


7
Funziona alla grande! Ed è gratuito, grazie. Per coloro che non sono riusciti a trovarlo (come me). È qui: Database -> Reverse Engineer -> Nel modello MySQL o nel diagramma EER -> Database -> Sincronizza con qualsiasi sorgente
bentzy

Funziona bene. Tuttavia, è possibile confrontare solo database con lo stesso nome. Ho più database (client multi-tenant) che voglio sincronizzare da una versione "master" sullo stesso host. Quindi devo rinominare il master in modo che corrisponda al db di ciascun client prima della sincronizzazione. Altrimenti bello!
scipilot,

Ulteriori informazioni al riguardo sono disponibili su questo link
Steven Ryssaert,

13

Esistono sicuramente molti modi, ma nel mio caso preferisco il comando dump e diff. Quindi ecco una sceneggiatura basata sul commento di Jared:

#!/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

Il feedback è il benvenuto :)



11

Se devi solo confrontare schemi (non dati) e avere accesso a Perl, mysqldiff potrebbe funzionare. L'ho usato perché ti consente di confrontare i database locali con i database remoti (tramite SSH), quindi non devi preoccuparti di scaricare alcun dato.

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

Tenterà di generare query SQL per sincronizzare due database, ma in realtà non mi fido di me (o di qualsiasi altro strumento). Per quanto ne so, non esiste un modo affidabile al 100% per decodificare le modifiche necessarie per convertire uno schema di database in un altro, soprattutto quando sono state apportate più modifiche.

Ad esempio, se si modifica solo il tipo di una colonna, uno strumento automatico può facilmente indovinare come ricrearlo. Ma se si sposta anche la colonna, la si rinomina e si aggiungono o rimuovono altre colonne, il meglio che può fare qualsiasi pacchetto software è indovinare cosa probabilmente è successo. E potresti finire per perdere dati.

Suggerirei di tenere traccia di eventuali modifiche dello schema apportate al server di sviluppo, quindi di eseguire quelle istruzioni manualmente sul server live (o di inserirle in uno script di aggiornamento o migrazione). È più noioso, ma manterrà i tuoi dati al sicuro. E quando inizierai a consentire l'accesso degli utenti finali al tuo sito, effettuerai davvero costanti modifiche al database?


Non dimenticare di fornire entrambi --hostNe --userNfallirà silenziosamente.
Znarkus,

Ho avuto problemi con gli strumenti mysqldbcompare di Oracle che generavano bug sugli indici e alteravano campi equivalenti. Lo strumento mysqldiff ha funzionato perfettamente e ha risparmiato un bel po 'di tempo.
Robert K,


6

check: http://schemasync.org/ lo strumento schemasync funziona per me, è uno strumento da riga di comando che funziona facilmente nella riga di comando di linux


1
Se hai problemi con l'installazione di questo su un mac, sono stato in grado di installarlo solo con mysql e python usando homebrew, con macports senza risultati.
Bijou Trouvaille,


3

C'è uno strumento utile scritto usando perl chiamato Maatkit . Ha diversi strumenti di confronto e sincronizzazione del database tra le altre cose.


Non sapevo di questo progetto! Grazie, sembra che abbia parecchi strumenti che sarebbero estremamente utili.
Vincent Ramdhanie,

2
Non ho trovato gli strumenti di confronto degli schemi in Maatkit.
stepancheg,

Nemmeno io - dove negli strumenti potremmo trovare questo?
Shabbyrobe,

Non credo ci sia un confronto di schemi lì dentro. Mi riferivo al confronto e alla sincronizzazione dei dati usando mk-table-checksum e mk-table-sync
Jarod Elliott,



3

Per quanto mi riguarda, inizierei con il dumping di entrambi i database e la differenziazione dei dump, ma se si desidera generare automaticamente gli script di unione, si vorrà ottenere uno strumento reale.

Una semplice ricerca su Google ha rivelato i seguenti strumenti:


3

Dai un'occhiata a dbForge Data Compare per MySQL . È uno shareware con un periodo di prova gratuito di 30 giorni. È uno strumento GUI MySQL veloce per il confronto e la sincronizzazione dei dati, la gestione delle differenze di dati e la sincronizzazione personalizzabile.

dbForge Data Compare per MySQL


3

Dopo ore alla ricerca di strumenti semplici sul web, mi sono reso conto di non cercare in Ubuntu Software Center. Ecco una soluzione gratuita che ho trovato: http://torasql.com/ Sostengono di avere anche una versione per Windows, ma la sto usando solo su Ubuntu.

Modifica: 2015-Feb-05 Se hai bisogno dello strumento Windows, TOAD è perfetto e gratuito: http://software.dell.com/products/toad-for-mysql/


2
Lo sviluppo di questo strumento è stato interrotto ed è ora incluso in Percona: percona.com/software/percona-toolkit
mrmuggles


2

Strumento di confronto e sincronizzazione molto facile da usare:
Database Comparer http://www.clevercomponents.com/products/dbcomparer/index.asp

vantaggi:

  • veloce
  • facile da usare
  • facile selezionare le modifiche da applicare

svantaggi:

  • non sincronizza la lunghezza con minuscoli ints
  • non sincronizza correttamente i nomi degli indici
  • non sincronizza i commenti

È vero, hanno fatto un aggiornamento superficiale con alcune piccole modifiche in 5 anni. Ma non viene sviluppato attivamente.
Artem Goutsoul

1

Penso che Navicat per MySQL sarà utile per questo caso. Supporta la sincronizzazione di dati e strutture per MySQL. inserisci qui la descrizione dell'immagine


0

Per la prima parte della domanda, faccio solo una discarica di entrambi e li diffondo. Non sono sicuro di mysql, ma postgres pg_dump ha un comando per scaricare lo schema senza il contenuto della tabella, quindi puoi vedere se hai modificato lo schema.


MySQL ha un comando simile mysql_dump. Questa potrebbe essere una soluzione se potessi integrarla in un processo di distribuzione. Grazie.
Vincent Ramdhanie,

Inoltre, per un'esperienza più user-friendly, puoi ottenere lo stesso usando phpMyAdmin - un vero killer per gli utenti MySQL!
schonarth,

Schemi identici possono facilmente comportare dump di schemi diversi. Versioni diverse del client mysql potrebbero produrre dump leggermente diversi (un problema se si confrontano schemi da due macchine diverse) e cose come chiavi esterne e vincoli potrebbero essere scaricati in un ordine diverso.
Mark E. Haase,

0

Sto lavorando con il team di marketing di Nob Hill, volevo dirti che sarò felice di ascoltare le tue domande, i tuoi suggerimenti o qualsiasi altra cosa, non esitare a contattarmi.

Inizialmente abbiamo deciso di creare il nostro strumento da zero perché mentre ci sono altri prodotti simili sul mercato, nessuno di loro fa il lavoro giusto. È abbastanza facile mostrarti le differenze tra i database. È piuttosto un altro creare un database come l'altro. La migrazione regolare, sia dello schema che dei dati, è sempre stata una sfida. Bene, l'abbiamo raggiunto qui.
Siamo così fiduciosi che potrebbe fornirti una migrazione senza problemi, se non lo fa - se gli script di migrazione che genera non sono abbastanza leggibili o non funzionano per te, e non possiamo risolverlo in cinque giorni lavorativi - otterrai la tua copia gratuita!

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


è una promessa? L'ho provato e si sono verificati alcuni errori, non ultimo il fatto che durante la migrazione di una funzione tenta di utilizzare lo stesso proprietario del database originale
Cruachan,

Sì, è una promessa. Per la maggior parte delle persone lo strumento funziona perfettamente. Promettiamo una licenza a vita per qualsiasi bug che trovi e non possiamo risolvere entro 5 giorni lavorativi. Si prega di contattare il nostro team di supporto.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.