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 安装
在安装utilities之前,需要先安装MySQL Connector/Python 驱动:
MySQL Connector/Python 驱动下载:
直接下载地址:
wget sql/archives/get/p/29/file/mysql-connector-python-2.1.7-1.el7.x86_64.rpm
MySQL Utilities 下载:
直接下载地址:
wget sql/archives/get/p/30/file/mysql-utilities-1.6.arch.rpm
安装:
yum install mysql-utilities-1.6.arch.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出差异化数据
背景:
某项⽬测试环境数据库被开发⼈员损坏,现从⽣产库中对⽐差异化数据,来达到恢复测试数据库的数据的⽬的。 本实验只是模拟该场
景,重要的是学习如何使⽤这个⼯具来出差异化的数据并恢复数据
库名连接地址⽤户名/密码
⽣产库fxkj172.16.10.37root/fxkj
测试库fxkj_test192.168.56.37root/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
-- ----------------------------mysql连接工具
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;
效果如下:
⽣产库:
测试库:
(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 -
# 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_sinc
e_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 语句
到测试库中,执⾏下 就可以恢复测试库中的数据
再次使⽤ 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 -
# 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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论