我曾经使用 Adam Spiers 的 mysqldiff 工具,但它已经很多年没有维护了,所以在一台新服务器上,我正在尝试 mysql-utilities 包,它包含一个类似的工具。但即使当我比较两个具有完全相同模式的数据库时,它们的名称不同这一事实(呃!)也足以让工具说比较失败(这似乎是发现差异的一个非常强大的词,但我想那是怎么运行的)。这是输出:
[root](22:05:48)[~]$ mysqldiff --server1=root:mypassword@localhost kizuna_master:kizuna_misa
# server1 on localhost: ... connected.
# Comparing `kizuna_master` to `kizuna_misa` [FAIL]
# Object definitions differ. (--changes-for=server1)
#
--- `kizuna_master`
+++ `kizuna_misa`
@@ -1 +1 @@
-CREATE DATABASE `kizuna_master` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
+CREATE DATABASE `kizuna_misa` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
Compare failed. One or more differences found.
在那种情况下,如果比较同一台服务器上的两个数据库,它总是会失败——这没有意义。我做错了什么吗?
编辑: 根据 Solarflare 的建议,我也尝试了 mysqldbcompare:
mysqldbcompare --skip-row-count --skip-data-check --run-all-tests --server1=root:mypassword@localhost kizuna_master:kizuna_dev
但它的结果与 mysqldiff 相同,但更冗长。对于这两个命令,它不仅在 CREATE DATABASE
定义上失败,而且在所有具有自动递增键字段的表上也失败!天哪 - 如果我说我不想比较数据 (--skip-data-check),为什么它认为我会希望它因为 AUTO_INCREMENT
而失败?以下是上述 mysqldbcompare
调用输出的第一部分:
# server1 on localhost: ... connected.
# Checking databases kizuna_master and kizuna_dev on server1
#
# Object definitions differ. (--changes-for=server1)
#
--- `kizuna_master`
+++ `kizuna_dev`
@@ -1 +1 @@
-CREATE DATABASE `kizuna_master` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
+CREATE DATABASE `kizuna_dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE action FAIL SKIP SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `kizuna_master`.`action`
+++ `kizuna_dev`.`action`
@@ -9,4 +9,4 @@
KEY `PersonID` (`PersonID`),
KEY `ContactTypeID` (`ActionTypeID`),
CONSTRAINT `action_ibfk_1` FOREIGN KEY (`ActionTypeID`) REFERENCES `actiontype` (`ActionTypeID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+) ENGINE=InnoDB AUTO_INCREMENT=1953 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
# TABLE actiontype FAIL SKIP SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `kizuna_master`.`actiontype`
+++ `kizuna_dev`.`actiontype`
@@ -4,4 +4,4 @@
`BGColor` char(6) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT 'FFFFFF',
`Template` text COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`ActionTypeID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
# TABLE addrprint pass SKIP SKIP
# TABLE attendance pass SKIP SKIP
# TABLE category FAIL SKIP SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `kizuna_master`.`category`
+++ `kizuna_dev`.`category`
@@ -4,4 +4,4 @@
`UseFor` enum('OP','P','O') CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT 'OP' COMMENT 'Whether the category can be used for people, orgs,
or both',
PRIMARY KEY (`CategoryID`),
KEY `Category` (`Category`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
等等……整个事情就是这样。
编辑 #2: 添加 --skip-table-options
让它对自动增量保持沉默,尽管我不知道还有什么其他区别选项将忽略我是否关心。但是虽然它仍然报告数据库名称差异,但它不再使用“失败”一词,所以我想这是一个改进。这是 mysqldbcompare --skip-row-count --skip-data-check --run-all-tests --skip-table-options --difftype=differ --server1=root:mypassword@ 的输出本地主机 kizuna_master:kizuna_dev
:
# server1 on localhost: ... connected.
# Checking databases kizuna_master and kizuna_dev on server1
#
# Object definitions differ. (--changes-for=server1)
#
- CREATE DATABASE `kizuna_master` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
? ^^^^ ^
+ CREATE DATABASE `kizuna_dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
? ^ ^
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE action pass SKIP SKIP
# TABLE actiontype pass SKIP SKIP
# TABLE addrprint pass SKIP SKIP
# TABLE attendance pass SKIP SKIP
# TABLE category pass SKIP SKIP
# TABLE config pass SKIP SKIP
# TABLE custom pass SKIP SKIP
# TABLE donation pass SKIP SKIP
# TABLE donationtype pass SKIP SKIP
# TABLE event pass SKIP SKIP
# TABLE household pass SKIP SKIP
# TABLE labelprint pass SKIP SKIP
# TABLE loginlog pass SKIP SKIP
# TABLE output pass SKIP SKIP
# TABLE outputset pass SKIP SKIP
# TABLE percat pass SKIP SKIP
# TABLE perorg pass SKIP SKIP
# TABLE person pass SKIP SKIP
# TABLE photoprint pass SKIP SKIP
# TABLE pledge pass SKIP SKIP
# TABLE postalcode pass SKIP SKIP
# TABLE preselect pass SKIP SKIP
# TABLE upload pass SKIP SKIP
# TABLE uploadtype pass SKIP SKIP
# TABLE user pass SKIP SKIP
# Databases are consistent given skip options specified.
#
# ...done
所以我想在我的 bash 脚本中我可以将其通过管道传输到 grep 并检查“失败”一词。但真是一团糟 - 旧的 mysqldiff
工具是如此简单明了。
另一个问题是关于工具版本的。 mysqldiff --help
说:“MySQL 实用程序 mysqldiff 版本 1.3.6(MySQL Workbench Distribution 5.2.47 的一部分)”。我最初直接下载了最新的,但它不会安装 - 这是 yum 在 CentOS7 上可以给我的。如果重要的话,我的数据库是 MariaDB 10.2.8。 (我开始讨论时是 10.2.4,但从那时起我就更新了。)
最佳答案
我遇到了同样的问题,但找到了解决方案。 mysqldiff 和 mysqldbcompare 都来自 mysql-utilities,因此共享相同的代码库。
在我的例子中,我需要在应该具有相同结构但不同名称的数据库上运行 laravel 迁移。当我运行 mysqldbcompare --version
它显示
MySQL Utilities mysqldbcompare version 1.6.1
License type: GPLv2
现在,就像你一样,我尝试检查数据库结构
mysqldbcompare --server1={server1} --server2={server1} --difftype=sql --skip-row-count --skip-data-check --run-all-tests --skip-table-选项 --changes-for=server2 {db1}:{db2}
在现有的 ubuntu 16.04 上,mysqldbcompare 引发了同样的错误,提示数据库名称不同:
# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Checking databases backend_21 on server1 and backend_1 on server2
#
# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `backend_21`
+++ `backend_1`
@@ -1 +1 @@
-CREATE DATABASE `backend_21` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
+CREATE DATABASE `backend_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
# WARNING: Could not generate SQL statements for differences between `backend_21` and `backend_1`. No changes required or not supported difference.
# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `backend_21`
+++ `backend_1`
@@ -1 +1 @@
-CREATE DATABASE `backend_21` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
+CREATE DATABASE `backend_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE bot_bus_connections pass SKIP SKIP
...
# TABLE user_settings pass SKIP SKIP
# Databases are consistent given skip options specified.
#
# ...done
经过一些调查,我发现此行为是一个已经报告的错误,并且已在版本 1.6.4 中修复:https://bugs.mysql.com/bug.php?id=77058 .
所以在手动升级这些 python 文件之后,我现在运行 mysqldbcompare --version
MySQL Utilities mysqldbcompare version 1.6.4
License type: GPLv2
结果如预期:
# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Checking databases backend_21 on server1 and backend_1 on server2
#
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE bot_bus_connections pass SKIP SKIP
...
# TABLE user_settings pass SKIP SKIP
# Databases are consistent given skip options specified.
#
# ...done
然而,仍然有一件烦人的事,那就是忽略了 CREATE TABLE
语句。因此,如果 database1(我的模板数据库)中有新表,它只会发出如下警告:
# WARNING: Objects in server1.backend_1 but not in server1.backend_2:
# TABLE: statistic_chats
# TABLE: localizations
# TABLE: statistic_customers
这也是从2015年就已经有报道了,到现在mysql还没有反应。我有点肮脏的解决方案是
- 搜索这个字符串
- 运行假的
CREATE TABLE
语句,所以表存在并且 - 重新运行迁移,用实际结构修复假表
希望对您有所帮助。
干杯
关于MySQL 实用程序 "mysqldiff": Database name difference alone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758402/