代码之家  ›  专栏  ›  技术社区  ›  Vincent Ramdhanie

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

  •  368
  • Vincent Ramdhanie  · 技术社区  · 16 年前

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

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

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

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

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


    答案中提到的工具:

    21 回复  |  直到 6 年前
        1
  •  210
  •   ydaetskcoR    10 年前

    如果您使用的是小型数据库,我发现在两个数据库上都运行mysqldump --skip-comments --skip-extended-insert 生成SQL脚本,然后在SQL脚本上运行diff的选项工作得很好。

    通过跳过注释,可以避免无意义的差异,例如运行mysqldump命令的时间。通过使用 --跳过扩展插入 命令确保每一行都插入自己的insert语句。这样就消除了一个新的或修改过的记录在将来的所有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
    
        2
  •  99
  •   Danny Beckett    10 年前

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

        3
  •  20
  •   seanyboy    16 年前

    我使用一个叫做 Navicat 到:

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

    它需要钱,它只有Windows和Mac,而且它有一个惊人的用户界面,但我喜欢它。

        4
  •  17
  •   Yury Litvinov    13 年前

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

    enter image description here

        5
  •  13
  •   ahill    16 年前

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

        6
  •  13
  •   develCuy    12 年前

    当然有很多种方法,但是在我的例子中,我更喜欢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
  •  12
  •   jmpeace    14 年前

    DBSOLO,是付费的,但这项功能可能是您要找的功能 http://www.dbsolo.com/help/compare.html

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

        8
  •  11
  •   Zac    9 年前

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

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

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

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

    我建议跟踪您对开发服务器所做的任何模式更改,然后在实时服务器上手动运行这些语句(或者将它们转入升级脚本或迁移)。这更乏味,但它能保证你的数据安全。当您开始允许最终用户访问您的站点时,您真的要不断地对数据库进行重大更改吗?

        9
  •  7
  •   Powertieke    16 年前
        10
  •  6
  •   likeuclinux    13 年前

    检查: http://schemasync.org/ SchemaSync工具对我有效,它是一个命令行工具,在Linux命令行中很容易工作。

        11
  •  4
  •   stepancheg    15 年前

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

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

        12
  •  3
  •   Jarod Elliott    16 年前

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

        13
  •  3
  •   George    16 年前

    按Redgate进行的SQL比较 http://www.red-gate.com/products/SQL_Compare/index.htm

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

        14
  •  3
  •   Craig Trader    16 年前

    对于我自己,我将从转储数据库和区分转储开始,但是如果您想要自动生成合并脚本,您将需要一个真正的工具。

    简单的 Google search 找到以下工具:

        15
  •  3
  •   Devart    14 年前

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

    dbForge Data Compare for MySQL

        16
  •  3
  •   Nikolay Ivanov    9 年前

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

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

        17
  •  2
  •   Naim Zard    14 年前

    ApacheZeta组件库是一个普通用途的库,其中包含用于开发基于PHP5的应用程序的松散耦合组件。

    EZ组件-数据库模式 允许你:

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

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

        18
  •  2
  •   TazGPL    11 年前

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

    优势:

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

    缺点:

    • 不同步长度到微小整数
    • 索引名称不正确同步
    • 不同步评论
        19
  •  1
  •   Jason Yau    13 年前

    我想 Navicat for MySQL 对这个案子会有帮助的。它支持MySQL的数据和结构同步。 enter image description here

        20
  •  0
  •   Paul Tomblin    16 年前

    对于问题的第一部分,我只做了一个二者的转储,并对它们进行了区分。关于mysql还不确定,但是postgres pg_dump有一个命令,只转储不包含表内容的模式,所以您可以查看是否更改了模式。

        21
  •  0
  •   Itamar    15 年前

    我在诺布山的营销团队工作,我想告诉你我很高兴听到你的问题,建议或其他任何事情,请随时联系我。

    我们最初决定从头开始创建我们的工具,因为尽管市场上有其他这样的产品,但没有一个产品做得对。显示数据库之间的差异非常容易。实际上,让一个数据库与另一个数据库一样,这是另一回事。模式和数据的平滑迁移一直是一个挑战。好吧,我们已经做到了。
    我们非常有信心,如果它生成的迁移脚本不够可读或对您不起作用,那么它可以为您提供一个平滑的迁移,而我们也不能在五个工作日内修复它,您将获得自己的免费副本!

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