mysql-utilities工具之MySQL数据库比对工具mysqldiff和mysqldbcompare

0    1146    1

Tags:

👉 本文共约4382个字,系统预计阅读时间或需17分钟。

简介

  • 如果要比较数据库表结构就使用mysqldiff,并生成差异SQL语句

  • 如果要比较数据库数据是否一致就使用mysqldbcompare,并生成差异SQL语句(全能比较,也可以比较数据库结构)

  • 如果要比较数据库主从一致使用pt-table-checksum,生成差异报告,在利用pt-table-sync数据修复

mysqldbcompare

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

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

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

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

比较检测的内容包括:

  1. 数据库定义的检查

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

  1. 检测数据库的对象

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

  1. 比较对象的定义

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

  1. 检测表的行数

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

  1. 检查表数据的一致性

这个检查包括检查第四步的行数,同时也检查数据是否一致。行不同显示不同的风格报告,缺失的行也是如此,默认是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语句。如下所示:

生成差异SQL语句来同步表数据

在生产环境中,为了数据的安全,往往会布置多台,来保障数据冗余。然而,有时会因各种原因导致数据的不一致。我们不仅仅想知道哪些数据是不同的,相反,更要知道如何去修复这些不一致的数据来保障冗余数据是一样的。比如,主从,数据不一致重新做主从,效率太低了。此外还不能确定哪个库上的数据是最新的。因此想要看到两个方向的SQL转换语句。在这种情况下,mysqldbcompare工具非常实用。

这节来说说如何使用mysqldbcompare来保证数据一致性。

比较生成差异性语句

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

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复