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?
16 réponses
Qu'en est-il de http://www.mysqldiff.org/ qui est freeware?
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
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.
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
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.
vous aurez besoin d'un outil, probablement, comme compareur de base de données.
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.
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.
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é.
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.
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
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.
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)
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!
SQL Examiner Suite 2010 compare les bases de données MySQL (à la fois schéma et données)
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..