Confronta due database MySQL [chiuso]
Domanda
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, tuttavia, accadrà di nuovo 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:
- Schema MySQL di Red-Gate e amp; Confronto dati (commerciale)
- Maatkit (ora Percona)
- liquibase
- Rospo
- Confronto database Nob Hill (commerciale)
- MySQL Diff
- SQL EDT (commerciale)
Soluzione
Se stai lavorando con database di piccole dimensioni, ho scoperto di eseguire mysqldump su entrambi i database con le opzioni --skip-commenti
e --skip-extended-insert
per 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 comando --skip-extended-insert
ti assicuri che ogni riga sia inserita con la sua 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
Altri suggerimenti
Toad for MySQL ha funzionalità di confronto di dati e schemi, e credo che lo farà persino creare uno script di sincronizzazione. Soprattutto, è freeware.
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.
Esiste uno strumento di sincronizzazione dello schema in SQLyog (commerciale) che genera SQL per la sincronizzazione di due database.
Dall'elenco di confronto delle funzionalità ... MySQL Workbench offre Schema Diff e Schema Synchronization nella loro edizione della community.
Esistono certamente 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 :)
dbSolo, è a pagamento ma questa funzione potrebbe essere quella che stai cercando http://www.dbsolo.com/help/compare.html
Funziona con Oracle, Microsoft SQL Server, Sybase, DB2, Solid, PostgreSQL, H2 e MySQL
Se hai solo bisogno di 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 esso (o di alcuno 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 automatizzato può facilmente indovinare come ricrearlo. Ma se si sposta anche la colonna, la si rinomina e si aggiungono o si rimuovono altre colonne, il meglio che un pacchetto software può fare è indovinare cosa probabilmente è successo. E potresti finire per perdere dati.
Suggerirei di tenere traccia di tutte le modifiche dello schema apportate al server di sviluppo, quindi di eseguire tali 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?
Dai un'occhiata a http://www.liquibase.org/
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
Esiste un altro strumento mysql-diff da riga di comando open source:
Esiste un utile strumento scritto usando perl chiamato Maatkit . Ha diversi strumenti di confronto e sincronizzazione del database tra le altre cose.
SQL Compare di RedGate http://www.red-gate.com/products/SQL_Compare/index. htm
DBDeploy per aiutare con la gestione delle modifiche al database in modo automatizzato http://dbdeploy.com/
Per quanto mi riguarda, inizierei con il dumping di entrambi i database e la differenziazione dei dump, ma se si desidera creare script di unione generati automaticamente, si vorrà ottenere uno strumento reale.
Una semplice Ricerca Google ha messo a punto i seguenti strumenti:
- MySQL Workbench , disponibile nelle varianti Community (OSS) e Commerciale.
- Confronto del database Nob Hill , disponibile gratuitamente per MySQL.
- Una lista di altri strumenti di confronto SQL.
Dai un'occhiata a dbForge Data Compare for 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.
Dopo ore alla ricerca di strumenti semplici sul web, mi sono reso conto di non cercare 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/
La libreria di componenti apache zeta è una libreria di uso generico di componenti liberamente accoppiati per lo sviluppo di applicazioni basate su PHP 5.
Componenti eZ - DatabaseSchema ti consente di:
.Create/Save a database schema definition; .Compare database schemas; .Generate synchronization queries;
Puoi controllare il tutorial qui: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema /tutorial.html
Strumento di confronto e sincronizzazione molto facile da usare:
Comparatore di database
http://www.clevercomponents.com/products/dbcomparer/index.asp
I vantaggi:
- veloce
- facile da usare
- facili da selezionare le modifiche da applicare
Svantaggi:
- non sincronizza la lunghezza con minuscoli ints
- non sincronizza correttamente i nomi degli indici
- non sincronizza i commenti
Penso che Navicat per MySQL sarà utile in questo caso . Supporta la sincronizzazione di dati e strutture per MySQL.
Per la prima parte della domanda, faccio semplicemente un dump 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.
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!