我想问一下是否可以比较两个巨大数据库的完整数据库结构。 我们有两个数据库,一个是开发数据库,另一个是生产数据库。 在我们发布代码的某些部分之前,我有时忘记对生产数据库进行更改,这导致生产数据库没有相同的结构,所以如果我们发布了一些内容,我们会遇到一些错误。 有没有办法比较两者,或同步?
答案 0 :(得分:14)
您可以使用命令行:
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql
diff file1.sql file2.sql
答案 1 :(得分:12)
对于MySQL数据库,您可以使用以下查询比较视图和表(列名和列类型):
SET @firstDatabaseName = '[first database name]';
SET @secondDatabaseName = '[second database name]';
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
LEFT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t2.tableRowType IS NULL
UNION
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
RIGHT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t1.tableRowType IS NULL;
如果您更喜欢使用带UI的工具,您也可以使用此脚本 https://github.com/dlevsha/compalex 它可以比较表格,视图,键等。
Compalex是一个用于比较两个数据库模式的轻量级脚本。它 支持MySQL,MS SQL Server和PostgreSQL。
答案 2 :(得分:5)
Red-Gate SQL Compare是一个很棒的工具,可以帮到你。我已经使用了多年并取得了巨大的成功。它为我节省了数千小时的工作量。
他们还有一个工具可以比较数据。我上面提到的产品比较了架构。
www-red-gate.com
答案 3 :(得分:5)
免费软件http://www.mysqldiff.org/怎么样?
答案 4 :(得分:4)
您可以使用--no-data转储它们并比较文件。
请记住在生产数据库中使用--lock-tables = 0选项以避免严重的全局锁定。
如果您使用相同的mysqldump版本(您的开发和生产系统应该具有相同的软件,对吗?)那么您将期望获得或多或少相同的文件。这些表格将按字母顺序排列,因此简单的差异很容易显示出差异。
答案 5 :(得分:2)
对于Linux上的 mysql ,可以通过phpmyadmin 导出没有'数据的数据库'而且只有结构。
滚动整个数据库的导出选项,只需取消选择数据'并将输出设置为文本。导出您想要比较的两个数据库。
然后在首选程序/站点的文件比较中,比较数据库的两个文本文件输出。在此解决方案中,同步仍然是手动的,但这对于比较和查找结构差异非常有效。
答案 6 :(得分:1)
您可能需要一种工具,例如Database comparer。
答案 7 :(得分:1)
根据您的数据库,可用的工具各不相同。
我使用Embarcadero的ER / Studio。它具有比较和合并功能。
还有很多其他的东西,比如Toad for MySQL,也有比较。同意Red-Gate建议,但从未将它用于MySQL。
答案 8 :(得分:1)
SchemaCrawler是一个免费的,独立于平台的工具,允许您比较数据库结构。这两个数据库不需要同时联机 - 您可以将数据库结构保存到人类可读的文本文件中。 Comaprisons使用标准差异工具完成。
我建议将比较自动化作为构建和部署过程的一部分,以确保您的生产系统永远不会过时。
答案 9 :(得分:1)
查看Gemini Delta - 用于.NET的SQL差异管理器。可以下载免费测试版,但完整版只需要几天的公开发布。
它不比较行级数据差异,但它比较了表,函数,sprocs等......而且它很快。 (新版本1.4,在4秒内加载和比较1k Sprocs,与我测试的其他工具相比,耗时超过10秒。)
每个人都是对的,但RedGate确实提供了很棒的工具。
答案 10 :(得分:1)
我试过mysqldiff没有成功,所以我想通过关注mysqlworkbench的比较功能来丰富未来的读者。 http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c13030
如果打开模型选项卡,并选择数据库菜单,则会得到比较模式选项,您可以使用该选项比较两个不同服务器上的两个不同模式,或同一服务器上的两个模式,或模式和模特,或许多其他我尚未尝试的选择。
答案 11 :(得分:0)
如果您使用的是MSSQL,我肯定会使用AdeptSQL。这是我看过的最不好看但最有才华的数据库比较工具。它可以比较结构和数据。它告诉您哪个表存在于一个数据库上但在另一个数据库上不存在,比较常用数据库的结构和数据,它可以生成脚本以同步这两个数据库。这不是免费的,但有30天的试用期(据我所知)
答案 12 :(得分:0)
试试dbForge Scheme Compare for SQL server。它可以比较和同步任何数据库方案。快速,简单,始终提供正确的结果。了解它如何在您的数据库中飞行!
答案 13 :(得分:0)
SQL Examiner Suite 2010比较MySQL数据库(架构和数据)
答案 14 :(得分:0)
我终于使用了一个名为“mysql structure compare”的简单工具来解决这个问题。它只适用于Windows,但它是免费的,它可以工作..
答案 15 :(得分:0)
如果您使用的是MySQL
,则有一个免费工具DB Matcher,您可以在其中上传2个.SQL
文件的结构,并且可以找到不同之处