比较两个MySQL数据库

我目前正在开发一个使用MySQL数据库的应用程序。

在开发过程中,数据库结构仍然不断变化(我改变了我的本地副本,只保留在测试服务器上)。

有没有办法比较数据库的两个实例,看看是否有任何改变?

虽然目前只是放弃以前的测试服务器数据库是好的,因为测试开始输入测试数据可能会有点棘手。
尽管如此,稍后会在生产中再次发生…

有没有简单的方法来增量更改生产数据库,最好通过自动创建一个脚本来修改它?


答案中提到的工具:

  • Red-Gate的MySQL模式和数据比较 (商业)
  • Maatkit(现在Percona)
  • liquibase
  • 蟾蜍
  • Nob Hill数据库比较 (商业)
  • MySQL差异
  • SQL EDT (商业)

如果你正在使用小型数据库,我发现在两个数据库上都使用--skip-comments--skip-extended-insert选项运行mysqldump来生成SQL脚本,然后在SQL脚本上运行diff就能很好地工作。

通过跳过注释可以避免无意义的差异,例如运行mysqldump命令的时间。 通过使用--skip-extended-insert命令,确保每行都插入自己的插入语句。 这消除了单个新的或修改的记录可以在将来的所有插入语句中引起连锁反应的情况。 使用这些选项运行产生更大的转储没有评论,所以这可能不是你想要在生产中使用,但开发应该没事。 我已经把我使用下面的命令的例子:

 mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql diff file1.sql file2.sql 

Toad for MySQL具有数据和模式比较功能,我相信它甚至会创建一个同步脚本。 最重要的是,它是免费的。

我使用一个名为Navicat的软件来:

  • 将Live数据库同步到我的测试数据库。
  • 显示两个数据库之间的差异。

它花钱,它只是Windows和Mac,它有一个糟糕的用户界面,但我喜欢它。

SQLyog (商业)中有一个Schema同步工具,用于生成用于同步两个数据库的SQL。

在这里输入图像描述

从功能比较列表… MySQL Workbench在其社区版本中提供架构差异和架构同步。

当然有很多方法,但在我的情况下,我更喜欢dump和diff命令。 所以这里是一个基于Jared评论的脚本:

 #!/bin/sh echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]" dump () { up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@}; mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2 } rm -f /tmp/db.diff # Compare up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@}; for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do if [ "`echo $3 | grep $table`" = "" ]; then echo "Comparing '$table'..." dump $1 /tmp/file1.sql dump $2 /tmp/file2.sql diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff else echo "Ignored '$table'..." fi done less /tmp/db.diff rm -f /tmp/file1.sql /tmp/file2.sql 

反馈是欢迎:)

dbSolo,它是付费的,但这个功能可能是你要找的那个http://www.dbsolo.com/help/compare.html

它适用于Oracle,Microsoft SQL Server,Sybase,DB2,Solid,PostgreSQL,H2和MySQL 替代文字

如果你只需要比较模式(而不是数据),并有权访问Perl,mysqldiff可能会工作。 我已经使用它,因为它可以让你比较本地数据库到远程数据库(通过SSH),所以你不需要打乱任何数据。

http://adamspiers.org/computing/mysqldiff/

它会尝试生成SQL查询来同步两个数据库,但是我不相信它(或者实际上是任何工具)。 据我所知,没有100%可靠的方法来反向设计将一个数据库模式转换为另一个数据库模式所需的更改,特别是在进行了多个更改时。

例如,如果只更改列的类型,则自动工具可轻松猜测如何重新创建该列。 但是,如果您也移动列,重新命名,并添加或删除其他列,最好的软件包可以做的是猜测可能发生了什么。 而你最终可能会丢失数据。

我建议跟踪您对开发服务器所作的任何模式更改,然后在实时服务器上手动运行这些语句(或将其转换为升级脚本或迁移)。 这是更乏味的,但它会保持你的数据安全。 当你开始允许最终用户访问你的网站时,你是否真的会不断地沉重的数据库变化?

检查: http : //schemasync.org/ schemasync工具为我工作,它是一个命令行工具很容易在Linux命令行

还有另外一个开源的命令行mysql-diff工具:

http://bitbucket.org/stepancheg/mysql-diff/

有一个用perl叫做Maatkit的有用的工具。 它有几个数据库比较和同步工具等等。

SQL比较RedGate http://www.red-gate.com/products/SQL_Compare/index.htm

DBDeploy以自动化的方式帮助数据库变更管理http://dbdeploy.com/

对于我自己,我会开始倾销这两个数据库和区分转储,但如果你想自动生成合并脚本,你会想要一个真正的工具。

一个简单的谷歌搜索出现了以下工具:

  • MySQL Workbench ,可在社区(OSS)和商业版本中使用。
  • Nob Hill数据库比较 ,可免费获取MySQL。
  • 其他SQL比较工具的列表 。

看看MySQL的dbForge数据比较 。 这是一个免费试用期为30天的共享软件。 这是一个快速的MySQL GUI工具,用于数据比较和同步,管理数据差异以及可定制的同步。

dbForge数据比较为MySQL

经过几个小时在网上搜索简单的工具,我意识到我没有看到Ubuntu软件中心。 这里是我找到的一个免费的解决方案: http : //torasql.com/他们声称也有一个Windows版本,但我只在Ubuntu下使用它。

编辑:2015年2月05日如果您需要Windows工具,TOAD是完美的和免费的: http : //software.dell.com/products/toad-for-mysql/

apache zeta组件库是一个通用库,用于开发基于PHP 5的应用程序的松耦合组件。

eZ组件 – DatabaseSchema允许您:

    。创建/保存数据库模式定义;
    。比较数据库模式;
    。产生同步查询;

你可以在这里查看教程: http : //incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

非常容易使用的比较和同步工具:
数据库比较器http://www.clevercomponents.com/products/dbcomparer/index.asp

优点:

  • 快速
  • 使用方便
  • 容易选择适用的变化

缺点:

  • 不会将长度同步到很小的整数
  • 不正确地同步索引名称
  • 不同步评论

我认为Navicat for MySQL将会对这种情况有所帮助。 它支持MySQL的数据和结构同步。 在这里输入图像描述

对于问题的第一部分,我只是做了一个转储,并将其差异化。 不知道有关mysql,但postgres pg_dump有一个命令,只是转储没有表内容的架构,所以你可以看到,如果你已经改变架构任何。

我正在和诺布山的营销团队合作,我想告诉你,我很乐意听到你的问题,建议或任何其他事情,请随时与我联系。

我们最初决定从头开始创建我们的工具,因为在市场上还有其他类似的产品时,他们都没有把工作做好。 向您展示数据库之间的差异很容易。 实际上使另一个数据库成为另一个数据库是另一回事。 平滑迁移,既有架构又有数据,一直是一个挑战。 那么,我们已经在这里实现了。
我们非常有信心,它可以为您提供顺利的迁移,如果迁移脚本没有足够的可读性或不适合您,而且我们无法在五个工作日内修复这些迁移脚本,你会得到你自己的免费副本!

http://www.nobhillsoft.com/NHDBCompare.aspx