我一直在寻找可以同步两个MySQL数据库架构的可移植脚本或命令行程序。我不是在寻找基于GUI的解决方案,因为它无法自动化或使用buid /部署工具运行。
基本上它应该做的是扫描database1和database2。检查模式差异(表和索引)并提出一组SQL语句在一个上运行,以便它获得另一个类似的结构,尽可能减少数据损坏。
如果某人可以指出实现此类解决方案的PHP,Python或Ruby包,我可以尝试从那里复制代码。
很多MySQL GUI工具可能都可以做到这一点,但我正在寻找一个可编写脚本的解决方案。
编辑:很抱歉没有更清楚:我正在寻找的是同步表结构,同时尽可能保持数据完好无损。不是数据复制。
更多信息:
为什么复制不起作用。
如果是GUI:不能使用它。我们不想为我的安装程序捆绑一个20MB的应用程序,仅用于DB diff。特别是当原始安装程序小于1 MB时。
答案 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版本)以及liquidbase和others。
虽然我认为其中大部分都会以受控方式对数据库应用一组更改。不知道他们是否可以从现有模式进行逆向工程并进行比较。
电子。
答案 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)