我目前正在使用 MySQL 数据库开发应用程序。
数据库结构在开发过程中仍在不断变化和变化(我更改了我的本地副本,仅将一个留在测试服务器上)。
有没有办法比较数据库的两个实例以查看是否有任何更改?
虽然目前简单地丢弃以前的测试服务器数据库很好,但随着测试开始输入测试数据,它可能会变得有点棘手。
同样的情况会在以后的生产中再次发生......
是否有一种简单的方法来增量更改生产数据库,最好是通过自动创建脚本来修改它?
答案中提到的工具:
我目前正在使用 MySQL 数据库开发应用程序。
数据库结构在开发过程中仍在不断变化和变化(我更改了我的本地副本,仅将一个留在测试服务器上)。
有没有办法比较数据库的两个实例以查看是否有任何更改?
虽然目前简单地丢弃以前的测试服务器数据库很好,但随着测试开始输入测试数据,它可能会变得有点棘手。
同样的情况会在以后的生产中再次发生......
是否有一种简单的方法来增量更改生产数据库,最好是通过自动创建脚本来修改它?
答案中提到的工具:
如果您正在使用小型数据库,我发现在两个数据库上运行 mysqldump 并使用--skip-comments
和--skip-extended-insert
选项来生成 SQL 脚本,那么在 SQL 脚本上运行 diff 效果很好。
通过跳过注释,您可以避免无意义的差异,例如运行 mysqldump 命令的时间。通过使用该--skip-extended-insert
命令,您可以确保使用自己的插入语句插入每一行。这消除了单个新记录或修改记录可能导致所有未来插入语句中的连锁反应的情况。使用这些选项运行会产生更大的转储而没有注释,因此这可能不是您在生产使用中想要做的事情,但对于开发来说应该没问题。我在下面放置了我使用的命令示例:
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
Toad for MySQL具有数据和模式比较功能,我相信它甚至会创建一个同步脚本。最重要的是,它是免费软件。
SQLyog (商业)中有一个模式同步工具,它生成用于同步两个数据库的 SQL。
从功能比较列表中... MySQL Workbench在其社区版中提供 Schema Diff 和 Schema Synchronization。
当然有很多方法,但就我而言,我更喜欢 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
欢迎反馈:)
dbSolo,它是付费的,但此功能可能是您正在寻找的功能 http://www.dbsolo.com/help/compare.html
它适用于 Oracle、Microsoft SQL Server、Sybase、DB2、Solid、PostgreSQL、H2 和 MySQL
如果您只需要比较模式(而不是数据),并且可以访问 Perl,那么 mysqldiff 可能会起作用。我使用它是因为它可以让您将本地数据库与远程数据库(通过 SSH)进行比较,因此您无需费心转储任何数据。
http://adamspiers.org/computing/mysqldiff/
它将尝试生成 SQL 查询以同步两个数据库,但我不信任它(或任何工具,实际上)。据我所知,没有 100% 可靠的方法可以对将一个数据库模式转换为另一个数据库模式所需的更改进行反向工程,尤其是在进行多项更改时。
例如,如果您只更改列的类型,自动化工具可以轻松猜测如何重新创建它。但是,如果您还移动列、重命名并添加或删除其他列,那么任何软件包所能做的最好的事情就是猜测可能发生的事情。您最终可能会丢失数据。
我建议跟踪您对开发服务器所做的任何架构更改,然后在实时服务器上手动运行这些语句(或将它们滚动到升级脚本或迁移中)。这更乏味,但它会确保您的数据安全。当您开始允许最终用户访问您的站点时,您真的会不断地对数据库进行大量更改吗?
检查: http: //schemasync.org/ schemasync 工具对我有用,它是一个命令行工具,可以在 linux 命令行中轻松工作
还有另一个开源命令行 mysql-diff 工具:
有一个使用 perl 编写的有用工具,称为Maatkit。它有几个数据库比较和同步工具等。
RedGate 的 SQL 比较 http://www.red-gate.com/products/SQL_Compare/index.htm
DBDeploy 以自动化方式帮助进行数据库变更管理 http://dbdeploy.com/
对于我自己,我会先转储两个数据库并区分转储,但如果您想要自动生成合并脚本,您将需要一个真正的工具。
一个简单的谷歌搜索出现了以下工具:
看看dbForge Data Compare for MySQL。这是一个有 30 天免费试用期的共享软件。它是一个快速的 MySQL GUI 工具,用于数据比较和同步、数据差异管理以及可自定义的同步。
在网上搜索简单工具几个小时后,我意识到我没有查看 Ubuntu 软件中心。这是我找到的免费解决方案:http: //torasql.com/ 他们声称也有适用于 Windows 的版本,但我只在 Ubuntu 下使用它。
编辑:2015-Feb-05 如果您需要 Windows 工具,TOAD 是完美且免费的:http: //software.dell.com/products/toad-for-mysql/
apache zeta 组件库是一个通用的松耦合组件库,用于开发基于 PHP 5 的应用程序。
eZ 组件 - DatabaseSchema允许您:
.创建/保存数据库模式定义; .比较数据库模式; .生成同步查询;
您可以在此处查看教程:http: //incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html
非常易于使用的比较和同步工具:
Database Comparer
http://www.clevercomponents.com/products/dbcomparer/index.asp
好处:
缺点:
我认为Navicat for MySQL对这种情况会有所帮助。它支持 MySQL 的数据和结构同步。
对于问题的第一部分,我只是对两者进行转储并区分它们。不确定 mysql,但 postgres pg_dump 有一个命令可以只转储模式而不转储表内容,因此您可以查看是否更改了任何模式。
我正在与 Nob Hill 的营销团队合作,我想告诉您,我很乐意听到您的问题、建议或任何其他内容,请随时与我联系。
我们最初决定从头开始创建我们的工具,因为虽然市场上还有其他此类产品,但它们都没有做好这项工作。向您展示数据库之间的差异非常容易。实际上使一个数据库像另一个数据库一样是另一回事。架构和数据的平滑迁移一直是一个挑战。好吧,我们在这里实现了它。
我们非常有信心它可以为您提供顺利的迁移,而不是如果它不能提供 - 如果它生成的迁移脚本可读性不够或对您不起作用,并且我们无法在五个工作日内修复它 -您将获得自己的免费副本!