在MySQL中同步两个数据库模式

时间:2009-01-19 08:38:58

标签: mysql synchronization

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

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

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

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

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

更多信息:

为什么复制不起作用。

  1. 安装基地遍布全州。
  2. 我们希望安装程序根据最新版本中的chagnes对数据库执行动态修复,而不管最终用户可能使用的旧版本。
  3. 更改主要是向表中添加新列,创建新索引或删除索引,在内部添加表或删除系统使用的表(我们不删除用户数据表)。
  4. 如果是GUI:不能使用它。我们不想为我的安装程序捆绑一个20MB的应用程序,仅用于DB diff。特别是当原始安装程序小于1 MB时。

6 个答案:

答案 0 :(得分:5)

您是否考虑过使用MySQL replication

答案 1 :(得分:4)

SQLyog这样做,真棒。我们经常在生产中使用它。

答案 2 :(得分:1)

对于长期的专业解决方案,您应该关注Schemamatic(http://versabanq.com/products/schemamatic.php)。此链接显示GUI应用程序,但它所做的只是操作命令行软件。在此页面中有链接到其谷歌代码网站,其中可以找到C#.Net版本的Schemamatic。您完美的解决方案是向Schemamatic添加对MySQL的支持。对于SQL Server来说,它是完美的,完全符合您的提及。

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

玩它,虽然它需要相当长的时间才能达到你想要的效果。 Schemamatic在我看来真的是你最好的选择。如果您在尝试使用Schemamatic时需要澄清,请告诉我。

答案 3 :(得分:1)

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

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

电子。

答案 4 :(得分:1)

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

我发现答案仍在这里,但我不记得网址了 这是一个从以下开始的脚本:

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

答案 5 :(得分:0)

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

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