我目前正在开发一个使用MySQL数据库的应用程序。

数据库结构在开发过程中仍在变化和变化(我更改本地副本,只保留测试服务器上的副本)。

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

虽然目前简单地丢弃之前的测试服务器数据库是可以的,但是随着测试开始输入测试数据,这可能会变得有点棘手。 同样的情况会在以后的制作中再次发生……

是否有一种简单的方法来增量地对生产数据库进行更改,最好是自动创建一个脚本来修改它?


答案中提到的工具:

Red-Gate的MySQL模式和数据比较(商用) Maatkit(现为Percona) liquibase 蟾蜍 Nob Hill数据库比较(商业) MySQL Diff SQL EDT(商用)


当前回答

如果您只需要比较模式(而不是数据),并且可以访问Perl,那么mysqldiff可能会起作用。我使用它是因为它允许您比较本地数据库和远程数据库(通过SSH),因此不需要转储任何数据。

http://adamspiers.org/computing/mysqldiff/

它将尝试生成SQL查询来同步两个数据库,但我不相信它(实际上也不相信任何工具)。据我所知,没有100%可靠的方法来逆向工程将一个数据库模式转换为另一个数据库模式所需的更改,特别是在已经进行了多个更改的情况下。

例如,如果您只更改一个列的类型,自动化工具可以轻松地猜测如何重新创建该列。但是,如果您还移动列,重命名它,并添加或删除其他列,那么任何软件包所能做的最好的事情就是猜测可能发生了什么。最后可能会丢失数据。

我建议跟踪您对开发服务器所做的任何模式更改,然后在活动服务器上手动运行这些语句(或将它们滚动到升级脚本或迁移中)。这样比较乏味,但可以保证数据的安全。当你开始允许终端用户访问你的网站时,你真的会不断地对数据库进行大量的更改吗?

其他回答

还有一个开源命令行mysql-diff工具:

http://bitbucket.org/stepancheg/mysql-diff/

用于MySQL的Toad具有数据和模式比较功能,我相信它甚至可以创建同步脚本。最重要的是,它是免费的。

检查:http://schemasync.org/ schemasync工具很适合我,这是一个命令行工具,可以在Linux命令行中轻松工作

当然有很多方法,但在我的情况下,我更喜欢dump和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

欢迎反馈:)

对于问题的第一部分,我只是把两者都做了一下,并将它们区别开来。不确定mysql,但postgres pg_dump有一个命令,只转储模式而不转储表内容,所以你可以看到你是否改变了模式。