比较两个MySQL数据库

Compare two MySQL databases

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

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

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

虽然目前只是丢弃以前的测试服务器数据库是好的,因为测试开始输入测试数据可能会有点棘手。
同样的情况会更晚发生在生产中......

是否有一种简单的方法可以逐步对生产数据库进行更改,最好是通过自动创建脚本来修改它?

答案中提到的工具:

  • Red-Gate的MySQL架构和数据比较(商业)
  • Maatkit(现在的Percona)
  • liquibase
  • 蟾蜍
  • Nob Hill数据库比较(商业)
  • MySQL Diff
  • SQL EDT(商业)


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

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

1
2
3
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 Synchronization Tool,它生成用于同步两个数据库的SQL。

enter image description here


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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
alt text


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

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

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

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

我建议跟踪您对开发服务器所做的任何架构更改,然后在实时服务器上手动运行这些语句(或将它们转换为升级脚本或迁移)。它更乏味,但它会保证您的数据安全。当您开始允许最终用户访问您的网站时,您是否真的要进行持续繁重的数据库更改?


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


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


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

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


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


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

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


对于我自己,我首先要转储两个数据库并对转储进行区分,但如果你想自动生成合并脚本,那么你将需要一个真正的工具。

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

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


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

dbForge Data Compare for 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允许您:

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

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


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

好处:

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

缺点:

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


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


对于问题的第一部分,我只是对两者进行转储并对它们进行区分。不确定mysql,但是postgres pg_dump有一个命令只是在没有表内容的情况下转储模式,所以你可以看看你是否已经更改了模式。


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

我们最初决定从零开始创建我们的工具,因为虽然市场上还有其他此类产品,但他们都没有做好工作。很容易向您展示数据库之间的差异。实际上像另一个一样创建一个数据库是另一回事。模式和数据的平滑迁移一直是一个挑战。好吧,我们在这里实现了它。
我们非常有信心它可以为您提供顺利的迁移,如果它没有 - 如果它生成的迁移脚本不够可读或不适合您,我们无法在五个工作日内修复它 - 你会得到自己的免费副本!

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