Comparer les structures de deux bases de données?

je voulais savoir s'il est possible de comparer la structure complète de deux énormes bases de données. Nous avons deux bases de données, l'un est une base de données de développement, l'autre une base de données de production. J'ai parfois oublié d'apporter des modifications à la base de données de production, avant de publier certaines parties de notre code, ce qui fait que la base de données de production n'a pas la même structure, donc si nous publions quelque chose, nous avons quelques erreurs. Est-il un moyen de comparer les deux, ou synchroniser?

19
demandé sur streetparade 2010-03-05 22:39:37

16 réponses

Qu'en est-il de http://www.mysqldiff.org/ qui est freeware?

4
répondu Anders Abel 2010-03-05 19:41:54

Vous pouvez utiliser la ligne de commande:

mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql
diff file1.sql file2.sql
10
répondu Gere 2014-10-15 13:53:12

pour la base de données MySQL vous pouvez comparer la vue et les tables (nom de colonne et type de colonne) en utilisant cette requête:

SET @firstDatabaseName = '[first database name]';
SET @secondDatabaseName = '[second database name]';

SELECT * FROM  
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @firstDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t1
LEFT JOIN                     
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @secondDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE 
  t2.tableRowType IS NULL        
UNION 
SELECT * FROM  
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @firstDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t1
RIGHT JOIN                     
  (SELECT
      CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
    FROM information_schema.columns cl,  information_schema.TABLES ss
    WHERE
      cl.TABLE_NAME = ss.TABLE_NAME AND
      cl.TABLE_SCHEMA = @secondDatabaseName AND
      ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
    ORDER BY
      cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE 
  t1.tableRowType IS NULL;

si vous préférez utiliser l'outil avec UI, vous pouvez aussi utiliser ce script https://github.com/dlevsha/compalex qui peuvent comparer des tables, des vues, des clés, etc.

Compalex est un script léger pour comparer deux schémas de base de données. Il prend en charge MySQL, MS SQL Server et PostgreSQL.

Capture d'écran (comparer table) Compare tables

10
répondu Dmitry 2015-09-07 09:54:41

comparaison SQL Red-Gate est un outil formidable qui fera cela pour vous. J'ai utilisé ce depuis des années avec un grand succès. Il m'a sauvé des milliers d'heures de travail.

Ils ont aussi un outil qui permettra de comparer les données. Le produit que j'ai mentionné ci-dessus compare schéma.

www-red-gate.com

5
répondu Randy Minder 2010-03-05 19:41:01

vous pouvez simplement les balancer avec --no-data et comparer les fichiers.

N'oubliez pas d'utiliser l'option --lock-tables=0 sur votre base de données de production pour éviter la grande serrure globale.

si vous utilisez la même version mysqldump (votre dev et vos systèmes de production devraient avoir le même logiciel, non? ensuite, vous pourrez vous attendre à obtenir plus ou moins de fichiers identiques. Les tableaux seront en ordre alpha, de sorte qu'un simple diff montrera des écarts facilement.

4
répondu MarkR 2010-03-05 23:10:19

vous aurez besoin d'un outil, probablement, comme compareur de base de données.

1
répondu davek 2010-03-05 19:41:25

selon votre base de données, les outils disponibles varient.

j'utilise le studio / salle D'urgence D'Amarcadero pour ça. Il a une fonction de comparaison et de fusion.

il y en a beaucoup d'autres, comme Crapaud pour MySQL, qui ont aussi des comparaisons. Aussi d'accord sur la suggestion Red-Gate, mais ne l'a jamais utilisé pour MySQL.

1
répondu codenheim 2010-03-05 19:43:02

Découvrez Gemini Delta-SQL Difference Manager pour .NET. Une version bêta gratuite est disponible au téléchargement, mais la version complète n'est disponible que dans quelques jours.

il ne compare pas les différences de données au niveau des rangées, mais il compare les tableaux, les fonctions, les sproc, etc... et il est rapide comme l'éclair. (La nouvelle version, 1.4, charge et compare des sproc 1k en moins de 4 secondes, par rapport à d'autres outils que j'ai testés qui ont pris plus de 10 Secondes.)

tout le monde est à droite mais RedGate fabrique de bons outils.

1
répondu Shaun 2011-03-15 17:27:31

j'ai essayé mysqldiff sans succès, alors j'aimerais enrichir les futurs lecteurs en attirant l'attention sur la fonction comparer de mysqlworkbench. http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030

si vous ouvrez un onglet model, et sélectionnez le menu bases de données, vous obtenez une option comparer des schémas, que vous pouvez utiliser pour comparer deux schémas différents sur deux serveurs différents, ou deux schémas sur le même serveur, ou un schéma et un modèle, ou beaucoup de d'autres options que je n'ai pas encore essayé.

1
répondu JoSSte 2014-08-03 11:04:27

mysql sur Linux, il est possible via phpmyadmin exporter les bases de données sans données et de la structure.

en faisant défiler les options d'exportation pour l'ensemble de la base de données, désélectionnez 'data' et définissez la sortie au texte. Exporter les bases de données que vous souhaitez comparer.

puis dans le fichier comparez dans votre programme / site préféré, comparez les deux sorties de fichier texte des bases de données. La synchronisation est encore manuelle dans cette solution, mais c'est efficace pour comparer et trouver les différences structurelles.

1
répondu user945389 2016-12-14 21:54:18
information_schema contenu pour comparer la colonne type de données, et de la table

SET @database_current = '<production>';
SET @database_dev = '<development>';
-- column and datatype comparison
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH,
    b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH
FROM information_schema.COLUMNS a
    LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME
        AND b.TABLE_NAME = a.TABLE_NAME
        AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
    AND (
        b.COLUMN_NAME IS NULL
        OR b.COLUMN_NAME != a.COLUMN_NAME
        OR b.DATA_TYPE != a.DATA_TYPE
        OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH
    );
-- table comparison    
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME
FROM information_schema.TABLES a
    LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME
        AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
    AND (
        b.TABLE_NAME IS NULL
        OR b.TABLE_NAME != a.TABLE_NAME
    );

espérons que ce script puisse aussi aider les personnes qui cherchent une solution non-applicative, mais l'utilisation de script. Acclamations

1
répondu Avidos 2018-03-03 04:54:11

SchemaCrawler est un outil libre, indépendant de la plate-forme qui vous permet de comparer les structures de base de données. Les deux bases de données n'ont pas besoin d'être en ligne en même temps - vous pouvez enregistrer votre structure de base de données dans un fichier texte lisible. Les Comaprisons sont réalisés en utilisant des outils de diff standard.

je recommande d'automatiser la comparaison dans le cadre du processus de construction et de déploiement, pour s'assurer que vos systèmes de production ne sont jamais dépassés.

0
répondu Sualeh Fatehi 2010-03-05 21:46:02

je serais certainement aller avec AdeptSQL si vous utilisez MSSQL. C'est le moins beau mais le plus talentueux outil de comparaison db parmi ceux que j'ai essayé. Il permet de comparer la structure et les données. Il vous dit quelles tables existent sur une db mais n'existent pas sur l'autre, compare la structure et les données des communes et il peut produire le script pour synchroniser les deux. Il n'est pas gratuit mais a un procès de 30 jours (autant que je me souvienne)

0
répondu aslisabanci 2010-03-24 09:20:32

dbForge Scheme Comparer pour SQL server. Il peut comparer et synchroniser n'importe quel schéma de base de données. Rapide, facile, fournissant toujours un résultat correct. Voir comment il vole sur votre base de données!

0
répondu Devart 2010-04-12 10:42:31

SQL Examiner Suite 2010 compare les bases de données MySQL (à la fois schéma et données)

0
répondu SQLDev 2010-05-13 09:28:13

j'ai finalement utilisé un outil simple appelé "mysql structure comparer" pour résoudre ce problème. C'est pour les fenêtres seulement, mais c'est gratuit et ça marche..

0
répondu Walty Yeung 2012-04-19 01:57:15