MySQL数据库数据对比工具——Mysqldbcompare

MySQL Utilities介绍

MySQL Utilities 提供一组命令行工具用于维护和管理 MySQL 服务器,包括:

  • 管理工具 (克隆、复制、比较、差异、导出、导入)
  • 复制工具 (安装、配置)
  • 一般工具 (磁盘使用情况、冗余索引、搜索元数据)

MySQL Utilities是一系列的命令行工具以及python库更容易完成管理的任务。库是用Python语言写的,这就意味着不需要安装其他任何工具和库。当前是基于Python2.6版本设计的,不支持Python3.1版本。

MySQL Utilities提供了各种平台的软件包,如果没有找到对应自己平台的包,可以通过源码进行编译安装。

Mysqldbcompare 介绍

mysqldbcompare是官方提供一个可以实现多库或单库比较数据一致的工具(全能比较),有文件和数据,并生成差异性SQL语句,并生成差异SQL语句,但是对于表数据很大情况下,mysqldbcompare测试运行效率并不是很高,有时候会报异常超时等。同样如果要比较数据库表结构就使用mysqldiff。

mysqldbcompare是MySQL Utilities中的一个脚本,默认的MySQL不包含工具集,所以需要安装MySQL Utilities

MySQL Utilities依赖环境

MySQL Utilities需要Python2.6版本,所有的代码都是基于该版本编写的。同时,还需要连接驱动MySQL Connector/Python 驱动

MySQL Utilities 安装

本教程使用的环境是centos7,
最新的MySQL Utilities可以在此处下载:http://dev.mysql.com/downloads/utilities/
  在安装utilities之前,需要先安装
MySQL Connector/Python 驱动:
MySQL Connector/Python 驱动下载:

 
MySQL数据库数据对比工具——Mysqldbcompare 直接下载地址:

wget https://downloads.mysql.com/archives/get/p/29/file/mysql-connector-python-2.1.7-1.el7.x86_64.rpm

MySQL Utilities 下载:
MySQL数据库数据对比工具——Mysqldbcompare 直接下载地址:

wget https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5-1.el7.noarch.rpm

安装:

yum install mysql-utilities-1.6.5-1.el7.noarch.rpm mysql-connector-python-2.1.7-1.el7.x86_64.rpm

验证是否安装成功:

[root@sre ~]# mysqldbcompare --version
MySQL Utilities mysqldbcompare version 1.6.5 
License type: GPLv2

 

mysqldbcompare 工具使用说明:

mysqldbcompare的语法如下:

$ mysqldbcompare --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1:db2
以上参数中:

--server1:MySQL服务器1配置。
--server2:MySQL服务器2配置。如果是同一服务器,--server2可以省略。
db1:db2:要比较的两个数据库。如果比较不同服务器上的同名数据库,可以省略:db2。
--all:比较所有两服务器上所有的同名数据库。--exclude排除无需比较的数据库。
--run-all-tests:运行完整比较,遇到第一次差异时不停止。
--changes-for=:修改对象。例如--changes-for=server2,那么对比以sever1为主,生成的差异的修改也是针对server2的对象的修改。
-d DIFFTYPE,--difftype=DIFFTYPE:差异的信息显示的方式,有[unified|context|differ|sql],默认是unified。如果使用sql,那么就直接生成差异的SQL,这样非常方便。
--show-reverse:在生成的差异修改里面,同时会包含server2和server1的修改。
--skip-table-options:保持表的选项不变,即对比的差异里面不包括表名、AUTO_INCREMENT、ENGINE、CHARSET等差异。
--skip-diff:跳过对象定义比较检查。所谓对象定义,就是CREATE语句()里面的部分,--skip-table-options是()外面的部分。
--skip-object-compare:默认情况下,先检查两个数据库中相互缺失的对象,再对都存在对象间的差异。这个参数的作用就是,跳过第一步,不检查相互缺失的对象。
--skip-checksum-table:数据一致性验证时跳过CHECKSUM TABLE。
--skip-data-check:跳过数据一致性验证。
--skip-row-count:跳过字段数量检查。

 

使用mysqldbcompare找出差异化数据

背景:     某项目测试环境数据库被开发人员损坏,现从生产库中对比差异化数据,来达到恢复测试数据库的数据的目的。 本实验只是模拟该场景,重要的是学习如何使用这个工具来找出差异化的数据并恢复数据

库名 连接地址 用户名/密码
生产库 fxkj 172.16.10.37 root/fxkj
测试库 fxkj_test 192.168.56.37 root/fxkj

(1)、模拟数据 生产库: 模拟在fxkj库中创建一个 enterprise_since_report表,并插入5条数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for enterprise_since_report
-- ----------------------------
DROP TABLE IF EXISTS `enterprise_since_report`;
CREATE TABLE `enterprise_since_report`  (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `org_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '企业编码',
  `name` varchar(126) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '姓名',
  `position` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '职务',
  `ctime` datetime(0) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '履职报告记录表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of enterprise_since_report
-- ----------------------------
INSERT INTO `enterprise_since_report` VALUES (1, '01', '飞翔科技', 'SRE', '2021-09-23 14:11:24');
INSERT INTO `enterprise_since_report` VALUES (2, '02', '海象科技', 'HRBP', '2021-09-01 14:14:43');
INSERT INTO `enterprise_since_report` VALUES (3, '03', '子牙科技', 'CTO', '2021-09-03 14:15:42');
INSERT INTO `enterprise_since_report` VALUES (4, '04', '龇牙科技', 'CF0', '2021-06-23 14:18:55');
INSERT INTO `enterprise_since_report` VALUES (5, '05', '头牙科技', 'CE0', '2021-09-04 14:19:45');

SET FOREIGN_KEY_CHECKS = 1;

测试库: 模拟在fxkj_test 库中创建一个 enterprise_since_report 表,并插入2条相同的数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for enterprise_since_report
-- ----------------------------
DROP TABLE IF EXISTS `enterprise_since_report`;
CREATE TABLE `enterprise_since_report`  (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `org_code` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '企业编码',
  `name` varchar(126) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '姓名',
  `position` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '职务',
  `ctime` datetime(0) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '履职报告记录表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of enterprise_since_report
-- ----------------------------
INSERT INTO `enterprise_since_report` VALUES (1, '01', '飞翔科技', 'SRE', '2021-09-23 14:11:24');
INSERT INTO `enterprise_since_report` VALUES (2, '02', '海象科技', 'HRBP', '2021-09-01 14:14:43');

SET FOREIGN_KEY_CHECKS = 1;

效果如下: 生产库:
MySQL数据库数据对比工具——Mysqldbcompare 测试库:
MySQL数据库数据对比工具——Mysqldbcompare (2)、使用
mysqldbcompare 工具找出 生产库和测试库中,差异化的数据 #–changes-for=server2 ,表示以server1 生产库为准,找出server2 测试库中 差异化的数据 #–difftype=sql 以SQL 形式生成差异化的SQL语句,方便直接执行恢复数据

[root@sre ~]# mysqldbcompare --server1=root:'fxkj'@172.16.10.37 --server2=root:'fxkj'@192.168.56.37 fxkj:fxkj_test --run-all-test --changes-for=server2 --difftype=sql

 # WARNING: Using a password on the command line interface can be insecure.
# server1 on 172.16.10.37: ... connected.
# server2 on 192.168.56.37: ... connected.
# Checking databases fxkj on server1 and fxkj_test on server2
#
#                                                   Defn    Row     Data   
# Type      Object Name                             Diff    Count   Check  
# ------------------------------------------------------------------------- 
# TABLE     enterprise_since_report                 pass    FAIL    -       
#           - Compare table checksum                                FAIL    
#           - Find row differences                                  FAIL    
#
# Row counts are not the same among `fxkj`.`enterprise_since_report` and `fxkj_test`.`enterprise_since_report`.
#
# Transformation for --changes-for=server2:
#

INSERT INTO `fxkj_test`.`enterprise_since_report` (`id`, `org_code`, `name`, `position`, `ctime`) VALUES('5', '05', '头牙科技', 'CE0', '2021-09-04 14:19:45');
INSERT INTO `fxkj_test`.`enterprise_since_report` (`id`, `org_code`, `name`, `position`, `ctime`) VALUES('4', '04', '龇牙科技', 'CF0', '2021-06-23 14:18:55');
INSERT INTO `fxkj_test`.`enterprise_since_report` (`id`, `org_code`, `name`, `position`, `ctime`) VALUES('3', '03', '子牙科技', 'CTO', '2021-09-03 14:15:42');



# Database consistency check failed.
#
# ...done

执行之后,可以很直观的发现 ,mysqldbcompare 给出了3条 差异化的数据,并以sql 的形式呈现,我们现在只需要拿着这个SQL 语句到测试库中,执行下 就可以恢复测试库中的数据
MySQL数据库数据对比工具——Mysqldbcompare 再次使用 mysqldbcompare 工具 ,发现生产库 和 测试库的 数据保持一致了

[root@sre ~]# mysqldbcompare --server1=root:'fxkj'@172.16.10.37 --server2=root:'fxkj'@192.168.56.37 fxkj:fxkj_test --run-all-test --changes-for=server2 --difftype=sql
 
 # WARNING: Using a password on the command line interface can be insecure.
# server1 on 172.16.10.37: ... connected.
# server2 on 192.168.56.37: ... connected.
# Checking databases fxkj on server1 and fxkj_test on server2
#
#                                                   Defn    Row     Data   
# Type      Object Name                             Diff    Count   Check  
# ------------------------------------------------------------------------- 
# TABLE     enterprise_since_report                 pass    pass    -       
#           - Compare table checksum                                FAIL    
#           - Find row differences                                  pass   

# Databases are consistent.
#
# ...done

 

 

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/8124

(0)
杰斯的头像杰斯
上一篇 2023年5月4日 下午6:05
下一篇 2023年5月5日 下午5:13

相关推荐

  • 服务器中挖矿木马病毒如何解决(kswapd0进程使cpu爆满)

    现象:系统cpu持续使用过高,造成无法远程连接 分析过程:一开始机器不能远程登录,但又能够ping通,登录信息也没有修改过,判断可能远程登录服务故障,后登录机器top发现,cpu使用率百分百,这很不正常,上面只运行了一个网站与数据库,发现异常进程kswapd0,查找资料后发现其是挖矿程序 解决方案:排查kswapd0进程 top 执行命令 netstat -…

    2022年12月13日
    1.8K00
  • linux修改limits.conf不生效

    一、修改方法 1.临时方法 为了优化linux性能,可能需要修改这个最大值。临时修改的话ulimit -n 204800就可以了,重启后失效。 2.永久生效方法 (1)、修改/etc/security/limits.conf文件 在文件末尾添加如下内容,然后重启服务器或重新登录即可生效。重启后用查看命令进行查看,如果显示数字等于204800即证明修改成功。如…

    2024年5月14日
    95100
  • Nginx负载均衡介绍

    Nginx应用场景之一就是负载均衡。在访问量较多的时候,可以通过负载均衡,将多个请求分摊到多台服务器上,相当于把一台服务器需要承担的负载量交给多台服务器处理,进而提高系统的吞吐率;另外如果其中某一台服务器挂掉,其他服务器还可以正常提供服务,以此来提高系统的可伸缩性与可靠性 下图为负载均衡示例图,当用户请求发送后,首先发送到负载均衡服务器,而后由负载均衡服务器…

    2022年11月16日
    1.2K00
  • Pmail——仅用一分钟就可以搭建好一个邮箱服务器

    有一个自己的邮箱,是不是光想着就觉得很酷。在之前,我介绍过一个邮箱poste.io 的搭建过程。虽然说是用docker但是其实搭建起来还是挺麻烦的。今天再来介绍一个搭建简单的邮局系统 pmail。 项目的优势: 1、部署简单 2、资源占用极小 编译后二进制文件仅15MB,运行过程中占用内存10M以内。 3、安全方面 支持dkim、spf校验。正确配置的情况下…

    2024年7月2日
    3.4K00
  • 解决crond引发大量sendmail、postdrop进程导致内存使用过大问题

    现象:客户反馈机器卡顿,上面只运行了一个宝塔,疑似中了木马 分析过程:top发现内存使用过高,ps -aux发现大量postdrop、sendmail、crond进程,而postdrop是由sendmail启动的,sendmail是由crond启动的。 crond在执行脚本时会将脚本输出信息以邮件的形式发送给系统用户,所以必然要调用sendmail,而sen…

    2022年12月6日
    1.9K00

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信