19

我一直在寻找可以同步两个 MySQL 数据库模式的可移植脚本或命令行程序。我不是在寻找基于 GUI 的解决方案,因为它无法自动化或使用构建/部署工具运行。

基本上它应该做的是扫描database1和database2。检查模式差异(表和索引)并提出一堆 SQL 语句在一个上运行,以便它获得与另一个相似的结构,尽可能减少数据损坏。

如果有人可以指出实现此类解决方案的 PHP、Python 或 Ruby 包,我可以尝试从那里复制代码。

很多 MySQL GUI 工具可能可以做到这一点,但我正在寻找一个可编写脚本的解决方案。

编辑:抱歉没有更清楚:我正在寻找的是表结构中的同步,同时尽可能保持数据完整。不是数据复制。

更多信息:

为什么复制不起作用。

  1. 安装基地遍布全州。
  2. 我们希望安装程序根据最新版本中的 chagnes 对数据库执行动态修复,而不管最终用户可能使用的旧版本是什么。
  3. 更改大多像向表添加新列,创建新索引或删除索引,添加表或删除系统内部使用的表(我们不删除用户数据表)。

如果是 GUI:不,不能使用。我们不想仅仅为了 DB diff 将 20MB 的应用程序与我们的安装程序捆绑在一起。特别是当原始安装程序小于 1 MB 时。

4

6 回答 6

6

您是否考虑过使用MySQL 复制

于 2009-01-19T08:43:06.897 回答
5

SQLyog可以做到这一点,而且非常棒。我们经常在生产中使用它。

于 2010-04-09T11:28:18.277 回答
2

我知道这是一个老问题,但这是我在谷歌上搜索的第一个结果(与最初的问题完全相同)

我仍然在这里找到了答案,但我不记得 URL 它是从以下开始的脚本:

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

结果更像这样

#!/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
于 2013-01-16T07:48:31.640 回答
1

对于长期、专业的解决方案,您应该关注 Schemamatic ( http://versabanq.com/products/schemamatic.php )。此链接显示了一个 GUI 应用程序,但它所做的只是操作一个命令行软件。在此页面中,有指向其 google 代码站点的链接,可以在其中找到 C# .Net 版本的 Schemamatic。您的完美解决方案是将 MySQL 支持添加到 Schemamatic。对于 SQL Server,它非常完美,并且完全符合您的要求。

现在,对于短期解决方案,我建议使用 MySQL 的命令行工具转储您想要的数据,例如: mysqldump -A -c -uroot -ppassword >bkpmysql.sql

和它一起玩,虽然它需要相当长的时间来实现你想要的。在我看来,Schemamatic 确实是您的最佳选择。如果您在尝试 Schemamatic 时需要任何说明,请告诉我。

于 2009-02-04T00:00:44.947 回答
1

您可能想查看一些工具,例如dbdeploy(这是 java 或 .net 版本)和liquidbase等。

尽管我认为其中大多数会以受控方式将一组更改应用于数据库。不知道他们是否可以从现有模式进行逆向工程并进行比较。

E.

于 2009-02-04T00:20:14.920 回答
1

检查这个是codeigniter数据库差异脚本生成器在此处输入图像描述

https://github.com/vaimeo/ci-database-diff-generator

于 2016-11-20T06:12:57.663 回答