比较两个MySQL数据库[关闭]


368

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

数据库结构仍在不断变化中,并且随着开发的进展而变化(我更改了本地副本,仅将其保留在测试服务器上)。

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

尽管当前只是简单地丢弃以前的测试服务器数据库是可以的,但是随着测试开始输入测试数据,它可能会有些棘手。
相同但更多,稍后将在生产中再次发生...

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


答案中提到的工具:


4
我相信RedGate的工具仅适用于SQL Server。
Dave R.

4
红门公司现在也有一个MySQL版本,目前由于扩展的早期访问而免费提供:red-gate.com/products/MySQL_Compare/index.htm
David Atkinson 2010年

2
这是一个真正的问题。我从开发人员部署到生产机器,它总是会破坏某些东西。感谢您提供的丰富信息
-Herr

1
Redgate的MySQL工具现在为每位用户$ 70。即使是这样的价格,我也会在这里进行评估并发表评论。
杰里米·麦基

刚才也需要这个,不得不增加一个字段的大小。不想只是增加它并怀疑一切都还好。@Jared提出了我所使用的确切建议。
塔斯(Tass)2012年

Answers:


210

如果您正在使用小型数据库,我发现两个数据库都使用--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

12
双重加倍投票,提高了命令行素养!!!
dogenpunk 2012年

5
要比较数据,请改用此方法;仍然是有关字符集等一些MySQL4 +评论mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d--no-data可能对那些需要生产使用的人很感兴趣,但只关心模式
Louis

7
更好的工具是MySQL自己开发的mysqldbcompare实用程序,您可以在Windows,Linux或Mac上使用它-它也可以输出数据和模式更改的SQL语句,并且比简单的命令行差异可以做更多的测试确定。
Jasdeep Khalsa

4
对于色彩方面的差异,请尝试vimdiff
gitaarik

99

Toad for MySQL具有数据和架构比较功能,我相信它甚至可以创建一个同步脚本。最重要的是,它是免费软件。


2
提到的所有工具看起来都不错。我现在可以任意选择Toad,直到可以进行更多研究为止。
Vincent Ramdhanie,

64
我对这个工具感到非常兴奋,直到我意识到它可以在Windows(而不是Linux)中运行。返回搜索...
jdias 2011年

2
对我来说很棒。做了我需要做的所有事情,并且高亮显示的更改记录的单元格使您可以轻松查看更改的内容。
泰晤士河2012年

4
带有--run-all-tests --difftype sql --disable-binary-logging选项的mysqldbcompare 可以完成几乎相同的工作(除了输出与注释混合在一起,并且不会转义字符串中的特殊字符)。
schemacs 2012年

4
@Anson Smith您能告诉我Linux的替代方法吗?
Visruth

20

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

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

它要花钱,只有Windows和Mac,而且界面怪异,但我喜欢。


它确实可以在Linux上运行。我现在在另一个桌面上打开它。用于从dev-> test-> live推送模式更改的结构同步功能仅值得许可费用。
斯彭斯上校08年

2
不错,我什至不知道它具有这些功能。到目前为止,这是Mac上最好的事情。
亨德拉·乌齐亚

似乎只能比较服务器上的数据库,而不是本地sql文件
AlxVallejo 2014年

@seanyboy,您为什么喜欢古怪的UI?
Pacerier

17

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

在此处输入图片说明


1
是的,这是这个最好的解决方案至今对我来说,提供了精细SQL同步查询,以便你可以随时更新,在任何地方..
阿努邦

过于昂贵且笨重,不适合事后修补
zanlok 2012年

1
非常慢,由于某种原因,它会丢弃并重新创建很多外键,即使在不需要时也是如此。无法跟进进度。
Artem Goutsoul 2012年

13

从功能比较列表中... MySQL Workbench在其社区版中提供了Schema Diff和Schema Synchronization。


7
很棒!它是免费的,谢谢。对于那些找不到的人(喜欢我)。它在这里:数据库->逆向工程师->在MySQL模型或EER图中->数据库->与任何源同步
bentzy 2014年

确实运作良好。但是,您只能比较相同名称的数据库。我有多个(多租户客户端)数据库,我想从同一主机上的“主”版本进行同步。因此,在同步之前,我必须重命名主机以匹配每个客户端数据库。否则很好!
scipilot 2015年

有关此信息的其他信息,
请参见此

13

当然有很多方法,但是就我而言,我更喜欢dump和diff命令。所以这是一个基于贾里德评论的脚本:

#!/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

欢迎反馈:)



11

如果您只需要比较架构(而不是数据),并且可以访问Perl,则mysqldiff可能有效。我之所以使用它,是因为它使您可以将本地数据库与远程数据库进行比较(通过SSH),因此您无需费心转储任何数据。

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

它将尝试生成SQL查询来同步两个数据库,但是我不信任它(或任何工具)。据我所知,没有100%可靠的方法可以对将一个数据库模式转换为另一种数据库模式的更改进行反向工程,尤其是在进行了多次更改时。

例如,如果仅更改列的类型,则自动化工具可以轻松猜测如何重新创建该列。但是,如果您还移动该列,对其进行重命名以及添加或删除其他列,则任何软件包所能做的最好的就是猜测可能发生的情况。您可能最终会丢失数据。

我建议您跟踪对开发服务器所做的任何架构更改,然后在实时服务器上手动运行这些语句(或将它们滚动到升级脚本或迁移中)。这比较繁琐,但可以确保您的数据安全。而且,当您开始允许最终用户访问您的网站时,您真的要对数据库进行不断的大量更改吗?


别忘了同时提供两者--hostN--userN否则它将默默地失败。
Znarkus 2014年

我在使用Oracle的mysqldbcompare工具时遇到麻烦,这些工具会在索引上生成错误,并更改等效的字段。mysqldiff工具可以完美地工作,并节省了大量时间。
罗伯特·K




3

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


我不知道这个项目!谢谢,看来它有很多工具将非常有用。
Vincent Ramdhanie,

2
我尚未在Maatkit中找到架构比较工具。
stepancheg

我都不是-在工具中哪里可以找到?
Shabbyrobe”,2011年

我认为其中没有架构比较。我指的是使用mk-table-checksum和mk-table-sync进行数据比较和同步
Jarod Elliott




3

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

dbForge MySQL数据比较


3

在网上搜索简单工具几小时后,我意识到我没有去过Ubuntu Software Center。这是我发现的免费解决方案:http : //torasql.com/ 他们声称也有Windows版本,但我只在Ubuntu下使用它。

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


2
该工具的开发已停止,现在已包含在Percona中:percona.com/software/percona-toolkit
mrmuggles 2014年



1

我认为Navicat for MySQL在这种情况下会有所帮助。它支持MySQL的数据和结构同步。 在此处输入图片说明


0

对于问题的第一部分,我只是将二者都做了转储并进行比较。不确定mysql,但是postgres pg_dump有一个命令只转储没有表内容的模式,因此您可以查看是否更改了模式。


MySQL具有类似的命令mysql_dump。如果我可以将其集成到部署过程中,那么这可能是一个解决方案。谢谢。
Vincent Ramdhanie,

此外,为了获得更加用户友好的体验,您可以使用phpMyAdmin来获得相同的东西-对于MySQL用户而言,这是真正的杀手!!
2008年

相同的架构很容易导致不同的架构转储。不同版本的mysql客户端可能会产生略有不同的转储(如果您要比较来自两台不同计算机的模式,则会出现问题),并且诸如外键和约束之类的内容可能会以不同的顺序转储。
Mark E. Haase

0

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

我们最初决定从头开始创建我们的工具,因为尽管市场上还有其他此类产品,但它们都做不到。很容易向您展示数据库之间的差异。实际上使一个数据库与另一个数据库完全不同。模式和数据的平稳迁移一直是一个挑战。好吧,我们已经在这里实现了。
我们坚信,它可以为您提供一个平稳的迁移,而不是它不能为您提供平滑的迁移-如果它生成的迁移脚本不够可读或对您不起作用,并且我们无法在五个工作日内对其进行修复-您将获得自己的免费副本!

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


那是一个诺言吗?我尝试了一下,结果掉了不少错误,尤其是在迁移函数时,它尝试使用与原始数据库相同的所有者
Cruachan

是的,这是一个承诺。对于大多数人来说,该工具可以正常工作。对于您发现的任何错误,我们承诺提供终身许可证,并且我们将在5个工作日内将其修复。请联系我们的支持团队。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.