mysql - 比较两个MySQL数据库

  显示原文与译文双语对照的内容

我现在正在开发一个MySQL数据库。 我的开发机器上有这个数据库的副本,我在开发和测试服务器上进行了快速修改。 我的疑问是:

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

在测试服务器上简单地使用数据库不是一个真正的问题,但作为用户输入测试数据的最终开始,它可能有点棘手。 相关的问题稍后也会在生产中相关。

是否有一个简单的方法来增量更改生产数据库? 也就是说,假设我添加了一个新表并修改了一个现有表,是否有工具可以检测更改并生成能够安全地执行数据库副本的更新的脚本?

EDIT: 解答中提到的工具:

时间:

如果你正在使用小型数据库我发现运行mysqldump于两个数据库用 --skip-comments--skip-extended-insert 选项来生成SQL脚本,然后在运行diff的SQLScripts却运行良好。

通过跳过注释,你避免了无意义的差异,比如运行MySQL命令的时间。 通过使用 --skip-extended-insert 命令,你可以确保每行都插入了自己的插入语句。 这消除了一个新的或者修改过的记录在所有未来的insert语句中可能导致连锁React的情况。 无批注于开发它应该fine,相关运行使用这个模式产生的转储文件较大所以这可能是它们并不是你想要做的在生产环境中使用 but. 我已经放置了下面使用的命令示例:


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

于同步两个相关databases,发生架构同步工具在 SQLyog ( 商业商品) 由它生成 sql.

enter image description here

有很多方法,但在我的例子中,我更喜欢转储和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

欢迎使用反馈:)

dbSolo,它是付费的,但这个功能可能是你正在寻找 http://www.dbsolo.com/help/compare.html

它适用于 Oracle,微软 SQL Server,Sybase,DB2,实体,PostgreSQL,H2和 MySQL alt text

...