MySQL 实用程序 "mysqldiff": Database name difference alone?

标签 mysql difference utility

我曾经使用 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还没有反应。我有点肮脏的解决方案是

  1. 搜索这个字符串
  2. 运行假的 CREATE TABLE 语句,所以表存在并且
  3. 重新运行迁移,用实际结构修复假表

希望对您有所帮助。

干杯

关于MySQL 实用程序 "mysqldiff": Database name difference alone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758402/

相关文章:

mysql - SQL字符串替换2个单词之间的内容

mysql - XAMPP MySQL 在 MacBook Air (MacOS Sierra 10.12.2) 上启动失败

php - 如何使用 mysqli 在 php 变量中存储 mysql select 语句

c# - 当我的方法是 Helper、Utility 或应该变成 Extension 时?

unix - 实现 "more"Unix 实用程序命令

php - 显示 cookie 数组中的 3 个值?

perl - 读取两个 YAML 文件并比较两者中出现的模块

php - PHP登录验证之间有区别吗

python - 两个列表中项差的最小和

linux - 有没有办法在 posix shell 或 bash 中扇出流?