MySQL管理工具MySQL Utilities — mysqldbcompare(4)

mysqldbcompare从两个数据库比较对象和数据的不同。显示差异可以使用不同风格,如GRID, CSV, TAB, 或 VERTICAL。

在比较过程中数据不可以改变,否则出现错误。

数据库中的对象包括:表、视图、触发器、存储过程、函数和事件。每一个对象类型计数可以使用-vv选项显示。

通过一系列步骤检查进行测试,默认情况下,一旦测试失败就终止检测。可以指定 –run-all-tests 选项来进行所有的测试。

比较检测的内容包括:

1. 数据库定义的检查

一个数据库存在的前提是检测确保数据库都存在。如果不存在,不需要进行下一步检测, –run-all-tests选项也被忽略的。

2. 检测数据库的对象

检测两者数据库中的对象是否丢失。剩余的检测是针对这些数据库对象的。可以使用–skip-object-compare跳过该测试。当你已知缺少某些对象这个选项是有用的。

3. 比较对象的定义

对对象的定义(CREATE语句)进行比较和显示不同。可以使用 –skip-diff 选项跳过这步。当你已知对象不同想忽略可用这个选项。

4. 检测表的行数

这个检查确保这两个表有相同的行数,但这并不确保表的数据是一致性的。只是粗略性的检查表数据行数的缺失与否,识别丢失的行。可以使用 –skip-row-count选项跳过这步。

5. 检查表数据的一致性

这个检查包括检查第四步的行数,同时也检查数据是否一致。行不同显示不同的风格报告,缺失的行也是如此,默认是GRID。

这个检查分为两步:首先对全表进行checksum校验,然后如果这步失败了算法将找出不同。

可以使用–skip-checksum-table 选项跳过表校验,使用–skip-data-check选项跳过数据检查。

如果你不想进行所有的检查,可以使用 –skip-xxx 选项来只进行某个测试。这在只想同步避免执行所有的测试非常有用。

测试的状态信息:

  • pass测试成功
  • FAIL测试失败
  • SKIP缺少或跳过测试
  • WARN测试时出现不寻常的但不是错误
  • 测试不适用于该对象

指定如何显示 diff-style输出:

可以通过–difftype选项来定义输出风格。

  • unified (default)统一的格式输出
  • context上下文格式输出
  • differdiffer-style格式输出
  • sqlSQL转换语句输出

指定如何显示行丢失或改变的输出:

可以通过使用–format选项来定义。

  • grid (default)网格化输出,类似于mysql命令行客户端输出
  • csv逗号分隔格式输出
  • tab制表符格式输出
  • vertical类似于mysql命令行客户端\G执行的输出

–changes-for选项控制着差异报告(默认)还是转换报告(需要–difftype=sql选项),以谁为参照物。如:

最左边的db1对应于–server1选项,最右边的dbx对应于–server2选项。

  • --changes-for=server1: 针对server1,以server2为参照物(默认)
  • --changes-for=server2: 针对server2,以server1为参照物

需要指定连接参数同时还需要一定的访问权限。

如果服务器上启用二进制日志,不想比较日志这步,可以使用 –disable-binary-logging 选项来禁用。

参数选项:

 所需权限

所要连接比较的数据库需要有 SELECT, CREATE TEMPORARY TABLES 和 INSERT  权限。

需要对mysql数据库有SELECT权限。

如果二进制启用同时使用到 –disable-binary-logging选项,该用户必须要有SUPER权限。

比较实例

使用下面的命令来比较本地服务器上的emp1和emp2数据库。进行所有的测试,不管是否失败。

db1和db2表结构一样,表数据不一致,如下所示:

生产转换的SQL语句,使db1.t1数据与db2.t1一致,使用–changes-for=server1 选项。同时还必需使用-a选项来确保数据的一致性检查。如下所示:

相反的,针对server2,以server1为参照物。如下所示:

使用 –difftype=sql 选项生产差异的SQL语句,同时,使用 –show-reverse选项可以显示出双方的SQL语句。如下所示:

下节来看看具体应用。