【问题标题】:Synchronize two databases schema in MySQL在 MySQL 中同步两个数据库模式
【发布时间】:2016-11-20 14:12:57
【问题描述】:

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

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

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

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

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

更多信息:

为什么复制不起作用。

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

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

【问题讨论】:

  • +1 很好的问题。我正要问它,因为我正在寻找相同的解决方案......但找到了这个。

标签: mysql synchronization


【解决方案1】:

您考虑过使用MySQL replication 吗?

【讨论】:

  • 我怀疑 OP 正在寻找尽可能简单的东西来复制模式。我猜 MySql 复制可以做到这一点,但设置起来并不简单。
  • 复制更容易设置(如果你有权限的话)然后编写一个 SQL diff 工具。
  • 根据...because data is replicated to the slave...,这似乎也需要数据复制。此外,提供的 PHP 示例需要一个 DROP DATABASE 函数 - 这超出了问题的范围。
【解决方案2】:

SQLyog 做到了,这太棒了。我们经常在生产中使用它。

【讨论】:

  • 我同意,优秀的工具。但是,由于端口阻塞,它在我的大多数网络服务器上都不起作用。
  • @Talvi Watia,他们为这种情况提供了 PHP 代理。
【解决方案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

结果更像这样

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

【讨论】:

    【解决方案4】:

    对于长期的专业解决方案,您应该关注 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 时需要任何说明,请告诉我。

    【讨论】:

      【解决方案5】:

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

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

      E.

      【讨论】:

        【解决方案6】:

        检查这个是codeigniter数据库差异脚本生成器

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

        【讨论】:

        • 这是一个非常好的解决方案。我不得不稍微调整一下以适应我的框架,但很好。
        • 这还能用吗?能否详细介绍一下如何使用?
        • 是的,获取代码并按照 github 上的自述文件进行操作
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 1970-01-01
        • 2013-06-12
        相关资源
        最近更新 更多