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

比较两个库表内容的姿势

作者: 劫客轮蹲 | 来源:发表于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}}}'
    

    相关文章

      网友评论

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

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