比较两个MySQL数据库

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

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

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

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

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


答案中提到的工具:

388684 次浏览

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

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

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

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

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

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

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

SQL比较通过RedGate http://www.red-gate.com/products/SQL_Compare/index.htm < / p >

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

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

一个简单的谷歌搜索打开了以下工具:

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

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

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

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

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

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

我们最初决定从头开始创建我们的工具,因为虽然市场上有其他这样的产品,但没有一个能正确地完成这项工作。向您展示数据库之间的差异非常容易。实际上使一个数据库与另一个数据库相似是另一回事。模式和数据的平稳迁移一直是一个挑战。好了,我们已经做到了 我们非常有信心,它可以为您提供一个平稳的迁移,如果它不能——如果它生成的迁移脚本不够可读或不适合您,并且我们不能在5个工作日内修复它——您将获得自己的免费副本!< / p >

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

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

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

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

dbForge Data Compare for MySQL

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

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

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 < / p >

我认为Navicat for MySQL将有助于这种情况。它支持MySQL的数据和结构同步。enter image description here

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

enter image description here

查看:http://schemasync.org/ schemasync工具为我工作,这是一个命令行工具,在Linux命令行

在网上搜索了几个小时后,我意识到我没有在Ubuntu软件中心寻找简单的工具。 以下是我找到的一个免费解决方案: < a href = " http://torasql.com/ " rel =“nofollow”> http://torasql.com/ < / > 他们声称也有Windows版本,但我只在Ubuntu下使用 < p >编辑:2015 - 2月- 05 如果你需要Windows工具,TOAD是完美的和免费的: http://software.dell.com/products/toad-for-mysql/ < / p >

如果你正在使用小型数据库,我发现在两个数据库上运行mysqldump,使用--skip-comments--skip-extended-insert选项来生成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
非常容易使用比较和同步工具:
数据库比较器 http://www.clevercomponents.com/products/dbcomparer/index.asp < / p >

优点:

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

缺点:

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

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

欢迎反馈:)