时间:2021-05-24
在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变量group_concat_max_len,默认值为1024,超出部分会被阶段。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Excel表格有个很大的作用就是用来统计数据,有的时候我们为了更好的对比数据,想把Excel的两个窗口独立显示,这样对比数据会更加方便一点。下面就给大家介绍一下
数据对比静态图固然清晰,但是想要进一步差异化对比数据,就比较麻烦了。其实Excel具备很强的动态图表功能,配合复选框可以让更多的数据以动态图表的样子显示出来
箱线图分析结论的方法是: 1、首先收集数据,把需要分析的数据输入到Minitab当中。 2、然后在菜单栏依次点击图形、箱线图。 3、分析的数据是两组对比数
1月9日消息,德国电商MindFactory公布2020年12月份处理器、显卡销量统计数据出炉。其中包括AMD锐龙、Intel酷睿的对比数据。销量方面,AMD锐
当我们需要利用图表来对比两组数据的差异时,通常会用到塔形图,来看看吧! 方法/步骤 如图,数据表是2015和2016年的同比数据,我们希望做成图中的效果