【问题标题】:Compare two MySQL databases [closed]比较两个 MySQL 数据库 [关闭]
【发布时间】:2010-09-18 13:17:25
【问题描述】:

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

随着开发的进行,数据库结构仍在不断变化和变化(我更改了我的本地副本,仅将一个留在测试服务器上)。

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

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

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


答案中提到的工具:

【问题讨论】:

  • 我相信 RedGate 的工具仅适用于 SQL Server。
  • Red Gate 现在也有一个 MySQL 版本,目前免费,因为它处于扩展早期访问阶段:red-gate.com/products/MySQL_Compare/index.htm
  • 这是一个真正的问题。我从开发机器部署到生产机器,它总是会破坏一些东西。感谢您提供这篇内容丰富的帖子
  • Redgate 的 MySQL 工具现在是 70 美元/用户。即使以这个价格,我也会在这里评估和发布 cmets。
  • 刚才也需要这个,不得不增加一个字段的大小。不想只是增加它并怀疑一切都很好。 @Jared 准确地建议了我使用的内容。

标签: mysql database diff


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 别忘了同时提供--hostN--userN,否则它会默默地失败。
  • Oracle 的 mysqldbcompare 工具在索引上生成错误并更改等效字段时遇到了麻烦。 mysqldiff 工具完美运行,节省了大量时间。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

通过跳过 cmets,您可以避免无意义的差异,例如运行 mysqldump 命令的时间。通过使用--skip-extended-insert 命令,您可以确保使用自己的插入语句插入每一行。这消除了单个新记录或修改记录可能导致所有未来插入语句中的连锁反应的情况。使用这些选项运行会产生没有 cmets 的更大转储,因此这可能不是您在生产使用中想要做的事情,但对于开发来说应该没问题。我在下面放了我使用的命令示例:

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

【讨论】:

  • 对命令行素养加倍支持!!!
  • 要比较 data,请改用它;还是一些关于字符集等的 MySQL4+ cmets mysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
  • -d, --no-data 可能对那些需要生产使用但只关心架构的人感兴趣
  • 一个更好的使用工具是 MySQL 自己开发的 mysqldbcompare 实用程序,您可以在 Windows、Linux 或 Mac 上使用它 - 它还可以为数据和模式更改输出 SQL 语句,并执行比简单的命令行 diff 可以确定的测试要多得多。
  • 要获得漂亮的颜色差异,请尝试vimdiff
【解决方案4】:

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

【讨论】:

  • 所有提到的工具看起来都不错。在我可以进行更多研究之前,我暂时随意选择 Toad。
  • 我对这个工具感到非常兴奋,直到我意识到它在 Windows 中运行,而不是在 linux 中运行。返回搜索...
  • 对我来说太棒了。是否完成了我需要它做的所有事情,并且用于更改记录的突出显示的单元格可以很容易地看到发生了什么变化。
  • mysqldbcompare 和--run-all-tests --difftype sql --disable-binary-logging 选项几乎可以完成相同的工作(除了输出混合了注释,并且字符串中的特殊字符没有转义)。
  • @Anson Smith 你能告诉我 linux 的替代方案吗?
【解决方案5】:

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

优点:

  • 易于使用
  • 轻松选择要应用的更改

缺点:

  • 不将长度同步到小整数
  • 未正确同步索引名称
  • 不同步 cmets

【讨论】:

  • 没错,他们在 5 年内做了一些表面上的更新,只是做了一些小改动。但它并没有被积极开发。
【解决方案6】:

当然有很多方法,但就我而言,我更喜欢 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

欢迎反馈:)

【讨论】:

    【解决方案7】:

    检查:http://schemasync.org/ schemasync 工具对我有用,它是一个命令行工具,可以在 linux 命令行中轻松使用

    【讨论】:

    • 如果您在 Mac 上安装时遇到问题,我只能使用自制软件安装 mysql 和 python,而 macports 无济于事。
    【解决方案8】:

    SQLyog (commercial) 中有一个 Schema Synchronization Tool,它生成用于同步两个数据库的 SQL。

    【讨论】:

    • 是的,这对我来说是迄今为止最好的解决方案,提供精细的 SQL 同步查询,以便您可以随时随地更新它..
    • 过于昂贵和沉重,不适合事后修补
    • 非常慢,并且由于某种原因,即使不需要它,它也会丢弃并重新创建大量外键。无法跟踪进度。
    【解决方案9】:

    我认为Navicat for MySQL 会对这个案例有所帮助。它支持 MySQL 的数据和结构同步。

    【讨论】:

      【解决方案10】:

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

      eZ 组件 - DatabaseSchema 允许您:

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

      您可以在此处查看教程: http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

      【讨论】:

        【解决方案11】:

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

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

        【讨论】:

        • 这正是我想要的!太棒了!
        【解决方案12】:

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

        【讨论】:

          【解决方案13】:

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

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

          【讨论】:

          • 此项目不再处于开发阶段。
          【解决方案14】:

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

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

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

          【讨论】:

          • 这是一个承诺吗?我试过了,但出现了一些错误,尤其是在迁移函数时,它尝试使用与原始数据库相同的所有者
          • 是的,这是一个承诺。对于大多数人来说,该工具工作得很好。我们承诺为您发现的任何错误提供终身许可,并且我们无法在 5 个工作日内修复。请联系我们的支持团队。
          【解决方案15】:

          就我自己而言,我会先转储两个数据库并区分转储,但如果您想要自动生成合并脚本,您将需要一个真正的工具。

          一个简单的Google search 出现了以下工具:

          【讨论】:

            【解决方案16】:

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

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

            【讨论】:

            【解决方案17】:

            我用一个叫Navicat的软件来:

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

            它要花钱,它只有 windows 和 mac,而且它的 UI 很糟糕,但我喜欢它。

            【讨论】:

            • 它确实在 Linux 上运行。我现在在另一个桌面上打开它。从 dev->test->live 推送模式更改的结构同步功能值得单独支付许可费。
            • 不错,我什至不知道它有这些功能。到目前为止,这是 mac 上最好的东西。
            • 好像只比较服务器上的数据库,不比较原生sql文件
            • @seanyboy,你为什么喜欢古怪的用户界面?
            【解决方案18】:

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

            【讨论】:

            • 效果很好!而且是免费的,谢谢。对于那些找不到它的人(比如我)。它在这里:数据库 -> 逆向工程师 -> 在 MySQL 模型或 EER 图中 -> 数据库 -> 与任何源同步
            • 它运作良好。但是,您只能比较同名的数据库。我有多个(多租户客户端)数据库,我想从同一主机上的“主”版本同步。所以我必须在同步之前重命名主数据库以匹配每个客户端数据库。否则很好!
            • 更多信息请见link
            【解决方案19】:

            【讨论】:

            • +1 正是我想要的。
            【解决方案20】:

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

            【讨论】:

            • 我不知道这个项目!谢谢,它看起来有很多非常有用的工具。
            • 我没有在 Maatkit 中找到架构比较工具。
            • 我都没有——我们可以在工具的什么地方找到这个?
            • 我认为那里没有架构比较。我指的是使用 mk-table-checksum 和 mk-table-sync 进行数据比较和同步
            【解决方案21】:

            对于问题的第一部分,我只是对两者进行转储并区分它们。不确定 mysql,但 postgres pg_dump 有一个命令可以只转储模式而不转储表内容,因此您可以查看是否更改了任何模式。

            【讨论】:

            • MySQL 有一个类似的命令 mysql_dump。如果我可以将它集成到部署过程中,这可能是一个解决方案。谢谢。
            • 另外,为了获得更加用户友好的体验,您可以使用 phpMyAdmin 获得相同的体验——MySQL 用户的真正杀手!
            • 相同的模式很容易导致不同的模式转储。不同版本的 mysql 客户端可能会产生略有不同的转储(如果您正在比较来自两台不同机器的模式,则会出现问题),并且诸如外键和约束之类的内容可能会以不同的顺序转储。
            猜你喜欢
            • 1970-01-01
            • 2010-10-26
            • 2011-11-28
            • 2012-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-08
            • 1970-01-01
            相关资源
            最近更新 更多