2010-03-05 169 views
14

我想问一下是否可以比较两个大型数据库的完整数据库结构。 我们有两个数据库,一个是开发数据库,​​另一个是生产数据库。 在我们发布代码的某些部分之前,我有时会忘记对生产数据库进行更改,这会导致生产数据库不具有相同的结构,因此如果我们发布某些内容,我们会遇到一些错误。 有没有办法比较两者,还是同步?比较两个数据库的结构?

+0

我尝试了以下所有工具,大多数需要付钱,有些无法在mysql服务器上工作,而mysqldiff根本无法工作。我结束了倾销db strucdture和命令行比较。这很奇怪,因为我认为它应该是一个简单的工具(比命令行diff更健壮一点)? – 2012-04-18 06:46:53

回答

4

红门SQL比较是一个伟大的工具,将为你做到这一点。我已经使用了这个多年,取得了巨大的成功。它为我节省了数千小时的工作时间。

他们也有一个工具可以比较数据。我上面提到的产品比较了模式。

www-red-gate.com

+0

Red Gate SQL比较MySQL的工作吗?我的印象是只有MS SQL Server。 – Kibbee 2010-03-05 19:42:15

+0

@Kibbe你正确的只是为了mssql而不是为了mysql看看这里http://www.red-gate.com/about/index.htm – streetparade 2010-03-05 19:43:45

+0

是的,Red Gate确实有MySQL的一个版本。目前它正处于扩展测试阶段,所以现在完全免费使用。 http://www.red-gate.com/products/sql-development/mysql-compare/ – 2010-12-11 17:27:24

1

根据您的数据库,可用工具有所不同。

我使用英巴卡迪诺的ER/Studio的这一点。它具有比较和合并功能。

有很多其他国家,如蟾蜍为MySQL,也有比较。也同意Red-Gate的建议,但从未将它用于MySQL。

0

SchemaCrawler是一个自由的,独立于平台的工具,它允许您比较数据库结构。这两个数据库不需要同时联机 - 您可以将数据库结构保存为可读的文本文件。使用标准差异工具完成共同犯罪。

我会建议自动化的比较作为构建的一部分和部署流程,以确保您的生产系统是永远不会过时的。

4

您可以将它们转储为--no-data并比较文件。

记住使用--lock-表= 0选项对生产数据库,以避免大的讨厌的全局锁。

如果你使用相同的mysqldump版本(你的开发和生产系统应该有相同的软件,对吗?),那么你会期望得到更多或更少的相同的文件。这些表格将按字母顺序排列,因此简单的差异将很容易显示差异。

0

如果您使用的是MSSQL,我一定会用AdeptSQL。这是最不好看的,但我尝试过的最有天赋的数据库比较工具。它可以比较结构和数据。它告诉你哪个表存在于一个数据库中,但是不存在于另一个数据库中,比较常见数据库的结构和数据,并且可以生成脚本来同步这两个数据库。这不是免费的,但有30天的试用期(据我记忆)

1

退房双子座三角洲 - SQL差异经理.NET。免费测试版可供下载,但完整版仅距离公开发布仅有几天。

它并不比行级数据的差别,但它比较表,函数,存储过程,等等,这是快如闪电。 (新版本1.4在4秒内加载并比较了1k Sprocs,与我测试过的其他工具相比,花费了10秒钟。)

虽然大家都说得对,但RedGate确实是很棒的工具。

0

我终于使用了一种叫做“MySQL的结构比较”简单的工具来解决这个问题。它仅是为窗户,但它是免费的,它的工作原理..

1

我试图mysqldiff没有成功,所以我想提请注意mysqlworkbench的比较功能,丰富了未来的读者。 http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030

如果打开模型选项卡并选择数据库菜单,则会得到一个比较模式选项,可用于比较两个不同服务器上的两个不同模式或同一服务器上的两个模式或模式和一个模型,或许多其他选项我还没有尝试过。

9

您可以使用命令行:

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 
+1

好主意Gere,很容易找到区别,但不是表格名称与diff命令,所以我跳入tkdiff包。我强烈推荐它。 – suarsenegger 2016-12-23 10:38:36

9

对于MySQL数据库,你可以比较使用该查询视图和表(列名和列型):

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; 

如果您更喜欢使用工具用户界面你也可以使用这个脚本 https://github.com/dlevsha/compalex 它可以比较表,视图,键等

Compalex是一个轻量级的脚本来比较两个数据库架构。它 支持MySQL,MS SQL Server和PostgreSQL。

截图(比较表) Compare tables

+0

谢谢!非常好! – 2017-05-27 11:04:31

+0

这太好了。我用这个。谢谢。 – 2018-02-15 04:33:12

0

对于的MySQL在Linux,它是通过phpmyadmin的可能到数据库导出而不 '数据' 和唯一结构。

通过整个数据库导出选项滚动,只需取消“数据”,并设定输出为文本。导出您希望比较的两个数据库。

然后在文件比较你喜欢的程序/网站,比较数据库的两个文本文件输出。本解决方案中的同步仍然是手动的,但这对于比较和查找结构差异非常有效。

1

当前回答这样的问题,我做了一个使用information_schema内容比较列,数据类型的脚本,并表

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 
    ); 

希望这个脚本还可以帮助人们寻找非应用程序解决方案,但使用脚本。干杯

+1

我喜欢使用仅限于mysql的解决方案的想法。但是,过滤器OR b.COLUMN_NAME!= a.COLUMN_NAME是多余的,因为在JOIN条件内假定为等同,或者b.TABLE_NAME!= a.TABLE_NAME。 – 2018-03-08 18:50:40

+0

@PaulCampbell好点!感谢您的帮助,非常感谢。干杯 – Avidos 2018-03-09 00:42:14