paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

MySQL - Confronto di schemi e tabelle di due db

Esistono vari modi di effettuare il confronto tra due schemi, e molti di questi fanno riferimento a dei prodotti software, come ad esempio il Toad, SQLyog o DbForge.
QUi vi voglio invece illustrare due metodi, che sono carenti della parte grafica, ma che possono essere utilizzati a prescindere dal software e dall'ambiente sul quale si lavora (ad esempio, Toad non e' previsto per sistemi Ubuntu)

Metodo 1: mysqldiff
mysqldiff e' uno script PERL che permette di effettuare il confronto tra due strutture (schema o tabelle) di due dabase MySql. Il risultato della differenza e' una sequenza di comandi MySQl per permettere di trasformare la struttura del primo database in maniera identica rispetto al secondo.
Prima di procedere con una breve panoramica sui comandi principali, vi invito a consultare il manuale ufficiale
Qui mi limito ad elencarvi alcuni esempi, ripresi dal link indicato, mantenendo inalterati i commenti in inglese.

  # compare table definitions in two files
  mysqldiff db1.mysql db2.mysql

  # compare table definitions in a file 'db1.mysql' with a database 'db2'
  mysqldiff db1.mysql db2

  # interactively upgrade schema of database 'db1' to be like the
  # schema described in the file 'db2.mysql'
  mysqldiff -A db1 db2.mysql

  # compare table definitions in two databases on a remote machine
  mysqldiff --host=remote.host.com --user=myaccount db1 db2

  # compare table definitions in a local database 'foo' with a
  # database 'bar' on a remote machine, when a file foo already
  # exists in the current directory
  mysqldiff --host2=remote.host.com --password=secret db:foo bar



Metodo 2: Metodo manuale

Questo e' invece un metodo manuale il cui risultato e' esclusivamente la differenza. Consiglio chiaramente di usare il metodo 2 ed il plugin mysqldiff, ma questo che vi illustro puo' essere preso come un buon allenamento sui comandi MySql e unix ;)

Eseguiamo l'export dei due database in due file di testo.

mysqldump -u username -p --skip-opt dbname1 xar_block_instances > db01.sql
mysqldump -u username -p --skip-opt dbname2 xar_block_instances > db02.sql

Quindi lanciamo questo comando

diff -y --suppress-common-lines db01.sql db01.sql > diff.txt

Nota: l'export l'abbiamo lanciato disabilitando l'opzione otp, in maniera che il risultato sia riga per riga e quindi poi utilizzabile dal comando unix.