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

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

是否有一种方法可以比较数据库的两个实例,以查看是否有任何更改?

虽然目前简单地丢弃之前的测试服务器数据库是可以的,但是随着测试开始输入测试数据,这可能会变得有点棘手。 同样的情况会在以后的制作中再次发生……

是否有一种简单的方法来增量地对生产数据库进行更改,最好是自动创建一个脚本来修改它?


答案中提到的工具:

Red-Gate的MySQL模式和数据比较(商用) Maatkit(现为Percona) liquibase 蟾蜍 Nob Hill数据库比较(商业) MySQL Diff SQL EDT(商用)


对于问题的第一部分,我只是把两者都做了一下,并将它们区别开来。不确定mysql,但postgres pg_dump有一个命令,只转储模式而不转储表内容,所以你可以看到你是否改变了模式。


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


看看http://www.liquibase.org/


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


从功能比较列表中…MySQL Workbench在社区版中提供了模式差异和模式同步。


我用一个叫Navicat的软件:

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

它要花钱,只能在windows和mac上使用,界面也很古怪,但我喜欢。


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

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


就我个人而言,我将从转储两个数据库开始,并对转储进行差异处理,但如果您希望自动生成合并脚本,则需要使用真正的工具。

简单的谷歌搜索可以找到以下工具:

MySQL工作台,有社区版(OSS)和商业版。 Nob Hill数据库比较,免费提供MySQL。 其他SQL比较工具的列表。


如果您只需要比较模式(而不是数据),并且可以访问Perl,那么mysqldiff可能会起作用。我使用它是因为它允许您比较本地数据库和远程数据库(通过SSH),因此不需要转储任何数据。

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

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

例如,如果您只更改一个列的类型,自动化工具可以轻松地猜测如何重新创建该列。但是,如果您还移动列,重命名它,并添加或删除其他列,那么任何软件包所能做的最好的事情就是猜测可能发生了什么。最后可能会丢失数据。

我建议跟踪您对开发服务器所做的任何模式更改,然后在活动服务器上手动运行这些语句(或将它们滚动到升级脚本或迁移中)。这样比较乏味,但可以保证数据的安全。当你开始允许终端用户访问你的网站时,你真的会不断地对数据库进行大量的更改吗?


我正在与Nob Hill的营销团队合作,我想告诉你,我很高兴听到你的问题,建议或其他任何东西,请随时与我联系。

We originally decided to create our tool from scratch because while there are other such products on the market, none of them do the job right. It’s quite easy to show you the differences between databases. It’s quite another to actually make one database like the other. Smooth migration, both of schema and data, has always been a challenge. Well, we have achieved it here. We are so confident that it could provide you a smooth migration, than if it doesn’t – if the migration scripts it generates are not readable enough or won’t work for you, and we can’t fix it in five business days – you will get your own free copy!

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


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

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


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


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

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


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

eZ组件- DatabaseSchema允许您:

   .Create/Save a database schema definition;
   .Compare database schemas;
   .Generate synchronization queries;

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


我认为MySQL的Navicat对这种情况会有帮助。它支持MySQL的数据和结构同步。


在SQLyog(商业)中有一个模式同步工具,它可以生成用于同步两个数据库的SQL。


检查:http://schemasync.org/ schemasync工具很适合我,这是一个命令行工具,可以在Linux命令行中轻松工作


在网上搜索了几个小时后,我发现我没有在Ubuntu软件中心寻找简单的工具。 以下是我找到的一个免费解决方案: http://torasql.com/ 他们声称也有Windows版本,但我只在Ubuntu下使用。

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


如果您正在使用小型数据库,我发现在两个数据库上运行mysqldump,使用——skip-comments和——skip-extended-insert选项生成SQL脚本,那么在SQL脚本上运行diff效果非常好。

By skipping comments you avoid meaningless differences such as the time you ran the mysqldump command. By using the --skip-extended-insert command you ensure each row is inserted with its own insert statement. This eliminates the situation where a single new or modified record can cause a chain reaction in all future insert statements. Running with these options produces larger dumps with no comments so this is probably not something you want to do in production use but for development it should be fine. I've put examples of the commands I use below:

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

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

优点:

快 使用方便 易于选择要应用的更改

缺点:

不同步长度到小整数 没有正确地同步索引名 不同步注释


当然有很多方法,但在我的情况下,我更喜欢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

欢迎反馈:)