博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL--如何快速对比数据
阅读量:5144 次
发布时间:2019-06-13

本文共 1848 字,大约阅读时间需要 6 分钟。

在MySQL运维中,研发同事想对比下两个不同实例上的数据并找出差异,除主键外还需要对比每一个字段,如何做呢?

第一种方案,写程序将两个实例上的每一行数据取出来进行对比,理论可行,但是对比时间较长。

第二种方案,对每一行数据所有字段合并起来,取checksum值,再按照checksum值对比,看着可行,尝试下。

首先要合并所有字段的值,选用MySQL提供的CONCAT函数,如果CONCAT函数中包含NULL值,会导致最终结果为NULL,因此需要使用IFNULL函数来替换NULL值,如:

CONCAT(IFNULL(C1,''),IFNULL(C2,''))

加入表有很多行,手动拼个脚本比较累,别急,可以使用information_schema.COLUMNS来处理:

## 获取列名的拼接串SELECTGROUP_CONCAT('IFNULL(',COLUMN_NAME,','''')')FROM information_schema.COLUMNS WHERE TABLE_NAME='table_name';

假设我们有测试表:

CREATE TABLE t_test01(    id INT AUTO_INCREMENT PRIMARY KEY,    C1 INT,    C2 INT)

我们便可以拼接出下面的SQL:

SELECTid,MD5(CONCAT(IFNULL(id,''),IFNULL(c1,''),IFNULL(c2,''),)) AS md5_valueFROM t_test01

在两个实例上执行下,然后把结果使用beyond compare对比下,就很容易找出不相同的行以及主键ID

对于数据量较大的表,执行出来的结果集也很大,对比起来比较费劲,那就先尝试缩小结果集,可以将多行记录的md5值合并起来求MD5值,如果最后MD5值相同,则这些行相同,如果不同,则证明存在差异,再按照这些行进行逐行对比。

假设我们按照1000行一组来进行对比,如果需要将分组后的结果合并,需要使用GROUP_CONCAT函数,注意在GROUP_CONCAT函数中添加排序保证合并数据的顺序, SQL如下:

SELECTmin(id) as min_id,max(id) as max_id,count(1) as row_count,MD5(GROUP_CONCAT(MD5(CONCAT(IFNULL(id,''),IFNULL(c1,''),IFNULL(c2,''),)) ORDER BY id))AS md5_valueFROM t_test01GROUP BY (id div 1000)

执行结果为:

min_id    max_id    row_count    md5_value0        999        1000         7d49def23611f610849ef559677fec0c1000     1999       1000         95d61931aa5d3b48f1e38b3550daee082000     2999       1000         b02612548fae8a4455418365b3ae611a3000     3999       1000         fe798602ab9dd1c69b36a0da568b6dbb

当差异数据较少时,即使需要对比上千万数据,我们可以轻松根据根据min_id和max_id来快速定位到哪1000条数据里存在差异,再进行逐行MD5值对比,最终找到差异行。

最终对比图:

##=====================================================================##

PS:

在使用GROUP_CONCAT时,需要配置MySQL变量,默认值为1024,超出部分会被阶段。

参考链接:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

##=====================================================================##

提前祝各位春节快乐

 

转载于:https://www.cnblogs.com/TeyGao/p/8414657.html

你可能感兴趣的文章
每个程序猿都有个黑客小宇宙,自敲代码的时候就爆发了一发不可收拾
查看>>
天天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?
查看>>
while循环
查看>>
学习笔记之15-预处理指令1-宏定义
查看>>
Android Log
查看>>
TCP的三次握手与四次挥手(详解+动图)
查看>>
(转)ListView——BaseAdapter
查看>>
win10新装系统,显卡风扇转动,链接正常开机,但设备管理器如果显示,无法更新驱动...
查看>>
mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写...
查看>>
windows下cmd清屏命令cls
查看>>
github如何添加新的分支
查看>>
例题3-4 周期串
查看>>
51nod 最长公共子序列Lcs
查看>>
模型二
查看>>
操作系统知识体系总结
查看>>
TCP通信
查看>>
Docker存储驱动之总览
查看>>
306. Additive Number java solutions
查看>>
mysql+sqlserver 分页sql语句
查看>>
【学习】分支语句加一点小知识1026
查看>>