美文网首页
比较两个库表内容的姿势

比较两个库表内容的姿势

作者: 劫客轮蹲 | 来源:发表于2016-12-03 23:33 被阅读0次

在迁移库表、定位线上问题时,要对比两个库表的内容。根据数据规模和使用工具可以有很多种做法。

1. SQL 外连接查询。

查数据和处理数据都在DB完成。

select * from tb1 left join tb2 on t1.filed1 = t2.filed1 where t1.field2 <> t2.field2

这种方法适用于数据规模很小,db做外连接操作不会影响线上。如果数据量大,绝对不能用,一个不小心把db拖死那就玩砸了。 我们让数据查询和数据处理分离,把数据从db拉出来,做离线的对比。

2. 数据提取

echo "select field1,field2 from tb1;" | mysql -h ip -s -r

第一个字段最好是主键或唯一索引,这样后面对比时少些麻烦。
如果有的字段内容为空或者NULL,取出来的内容就没法区分这两个字段,我们用concat_ws把字段内容用分隔符连接起来,而不是用默认的空格。

select concat_ws('~', field1, field2) from tb1;

这时又发现一个问题,如果内容中有NULL,concat_ws会直接忽略,导致少了一个字段。于是,把字段用IFNULL包含起来。

select concat_ws('~', IFNULL(field1,''), IFNULL(field2,'')) from tb1;

3. 数据对比

数据提取的工作解决了,怎么对比两个文件的内容呢。数据量很多,而且大部分是相同的数据。代码对比用diff,除非完全一致,否则结果不可靠,还要人肉查看。简化下问题,这其实是求两个集合A、B的差集,即A有B没有。可以用下面的命令

grep -F -f B A -v 

或者

sort A B B | uniq -u

对称的,B有A没有,也可以取出来。如果想对比到底那些字段不一致,可以在对两个差集A', B'分别sort后join再awk比较, 得出哪个字段不一致。

join -t '~' -j 1 A' B' | awk  -F '~' '{for (i=0;i < 30; i++){if($(i+2) != $(i+2+30)) print i,$i}}}'

相关文章

  • 比较两个库表内容的姿势

    在迁移库表、定位线上问题时,要对比两个库表的内容。根据数据规模和使用工具可以有很多种做法。 1. SQL 外连接查...

  • mysql-备份-导入

    2020/09/031、备份表、表结构、表内容、备份库 #############################...

  • mysql-备份

    2020/09/031、备份表、表结构、表内容、备份库 前提:数据库和数据表要存在(已经被创建)1、导出数据库 -...

  • Navicat for Mysql使用之Memo

    数据库表中,有些查询出的字段内容比较多,点上去无法复制全部内容,需要展开看所有内容。此时,可以使用Memo。 选中...

  • FullCalendar(第三篇)

    数据库设计 以下是一个比较简单的数据库表的设计,除了FullCalendar中Event需要的一些内容(”ID标识...

  • MySQL 5.7 新增默认账号 mysql.session和m

    MySQL版本:5.7.23 在闲逛mysql时发现mysql库的user表下有两个账户比较特别:mysql.se...

  • mysql5.7.25和MySQL5.7.33查询结果不一致

    具体SQL太长了,也是业务SQL,修改SQL的可能性比较小,所以就查看了两个数据库的执行计划 两个数据库的表结构,...

  • 数据库基础使用

    数据库-密码/用户名:root 1.1数据库概述 1.2数据库表 1.3 表数据 两个对象对应数据表: 注:表中一...

  • mysqldiff

    本文基于centos 6.5 mysqldiff只能比较两个数据库所有表的差异,并不会生成create语句 默认的...

  • sharding-jdbc源码解析之sql单表或绑定表路由

    说在前面 sql路由这里的内容比较多,包含单表路由或者绑定表路由、多库多表路由、笛卡尔积路由,分三部分来介绍,今天...

网友评论

      本文标题:比较两个库表内容的姿势

      本文链接:https://www.haomeiwen.com/subject/wggcmttx.html