比较两个数据库的结构?

时间:2010-03-05 19:39:38

标签: mysql database compare structure mysqldump

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

16 个答案:

答案 0 :(得分:14)

您可以使用命令行:

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 :(得分:12)

对于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;

如果您更喜欢使用带UI的工具,您也可以使用此脚本 https://github.com/dlevsha/compalex 它可以比较表格,视图,键等。

  

Compalex是一个用于比较两个数据库模式的轻量级脚本。它   支持MySQL,MS SQL Server和PostgreSQL。

截图(比较表格) Compare tables

答案 2 :(得分:5)

Red-Gate SQL Compare是一个很棒的工具,可以帮到你。我已经使用了多年并取得了巨大的成功。它为我节省了数千小时的工作量。

他们还有一个工具可以比较数据。我上面提到的产品比较了架构。

www-red-gate.com

答案 3 :(得分:5)

免费软件http://www.mysqldiff.org/怎么样?

答案 4 :(得分:4)

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

请记住在生产数据库中使用--lock-tables = 0选项以避免严重的全局锁定。

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

答案 5 :(得分:2)

对于Linux上的 mysql ,可以通过phpmyadmin 导出没有'数据的数据库'而且只有结构。

滚动整个数据库的导出选项,只需取消选择数据'并将输出设置为文本。导出您想要比较的两个数据库。

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

答案 6 :(得分:1)

您可能需要一种工具,例如Database comparer

答案 7 :(得分:1)

根据您的数据库,可用的工具各不相同。

我使用Embarcadero的ER / Studio。它具有比较和合并功能。

还有很多其他的东西,比如Toad for MySQL,也有比较。同意Red-Gate建议,但从未将它用于MySQL。

答案 8 :(得分:1)

SchemaCrawler是一个免费的,独立于平台的工具,允许您比较数据库结构。这两个数据库不需要同时联机 - 您可以将数据库结构保存到人类可读的文本文件中。 Comaprisons使用标准差异工具完成。

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

答案 9 :(得分:1)

查看Gemini Delta - 用于.NET的SQL差异管理器。可以下载免费测试版,但完整版只需要几天的公开发布。

它不比较行级数据差异,但它比较了表,函数,sprocs等......而且它很快。 (新版本1.4,在4秒内加载和比较1k Sprocs,与我测试的其他工具相比,耗时超过10秒。)

每个人都是对的,但RedGate确实提供了很棒的工具。

答案 10 :(得分:1)

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

如果打开模型选项卡,并选择数据库菜单,则会得到比较模式选项,您可以使用该选项比较两个不同服务器上的两个不同模式,或同一服务器上的两个模式,或模式和模特,或许多其他我尚未尝试的选择。

答案 11 :(得分:0)

如果您使用的是MSSQL,我肯定会使用AdeptSQL。这是我看过的最不好看但最有才华的数据库比较工具。它可以比较结构和数据。它告诉您哪个表存在于一个数据库上但在另一个数据库上不存在,比较常用数据库的结构和数据,它可以生成脚本以同步这两个数据库。这不是免费的,但有30天的试用期(据我所知)

答案 12 :(得分:0)

试试dbForge Scheme Compare for SQL server。它可以比较和同步任何数据库方案。快速,简单,始终提供正确的结果。了解它如何在您的数据库中飞行!

答案 13 :(得分:0)

SQL Examiner Suite 2010比较MySQL数据库(架构和数据)

答案 14 :(得分:0)

我终于使用了一个名为“mysql structure compare”的简单工具来解决这个问题。它只适用于Windows,但它是免费的,它可以工作..

答案 15 :(得分:0)

如果您使用的是MySQL,则有一个免费工具DB Matcher,您可以在其中上传2个.SQL文件的结构,并且可以找到不同之处

https://dbmatcher.com