暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一种快速取得MySQL Binlog开始时间的方法

小灯数据 2021-06-08
3941
大家好,我是脚本小王子,今天和大家分享一下怎么样快速取得Binlog开始时间的方法
我们想知道一个binlog的开始时间和结束时间,往往是通过binlog文件的上一个文件的文件时间作为当前binlog的开始时间,当前binlog的文件时间作为结束时间,例如:
    [root@VM_0_6_centos binlog]# ll -lhrt
    total 163M
    -rw-r----- 1 mysql mysql 2.9K Mar 30 01:35 binlog.000082
    -rw-r----- 1 mysql mysql 2.0K Mar 30 01:54 binlog.000083
    -rw-r----- 1 mysql mysql 7.3K Mar 30 15:17 binlog.000084
    -rw-r----- 1 mysql mysql 148 Mar 30 15:17 binlog.index
    -rw-r----- 1 mysql mysql 163M Apr 1 14:07 binlog.000085
    [root@VM_0_6_centos binlog]#
    复制

      我们通过观察可得到binlog.000084这个文件的开始时间是“2020-03-30 01:54”(读binlog.000083的文件时间)。但如果我们只拿到一个binlog文件,又或者我想知道上述binlog.000082的开始时间呢?方法当然是有的,我们可以使用mysqlbinlog命令把binlog解析出来,然后再查看即可,例如:


      [root@VM_0_6_centos binlog]# mysqlbinlog -v binlog.000082 | head 
      /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
      /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
      DELIMITER /*!*/;
      # at 4
      #200327 23:45:14 server id 63306 end_log_pos 124 CRC32 0xfad483d6 Start: binlog v 4, server v 8.0.19 created 200327 23:45:14 at startup
      ROLLBACK/*!*/;
      BINLOG '
      ih9+Xg9K9wAAeAAAAHwAAAAAAAQAOC4wLjE5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAACKH35eEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
      CgHWg9T6
      [root@VM_0_6_centos binlog]#
      复制
      可见这个binlog的开始时间是“200327 23:45:14”(2020-03-27 23:45:14)。我们这个binlog.000082很小,只有2.9K,这种方法可以很快找出binlog的开始时间,但如果我们要查看的binlog很大呢?例如1G一个binlog,现在有几百个1G的binlog要查,那么这种方法是十分慢了。下面介绍一种查看binlog十六进制的文件头得出来的开始时间,shell函数如下:
        function getBinlogStartTime()
        {
        theFile="$1"
        #取出文件头做分析
        binlogHead=`hexdump ${theFile} | head -1`
        #binlog文件校验
        binlogCrc=`echo $binlogHead | awk '{print $1$2$3}'`
        if [ "${binlogCrc}" != '000000062fe6e69' ]; then
        echo '${theFile} is damage.'
        exit 1
        fi
        #计算binlog的开始时间
        binlogBeginTimeInt=`echo $binlogHead | awk '{print $5$4}' | gawk ' { printf strtonum("0x" $0)}' `
        binlogBeginTime=`date -d "1970-01-01 UTC $binlogBeginTimeInt seconds" "+%F %T"`
        echo $binlogBeginTime
        }
        #调用方法:getBinlogStartTime binlog.000082
        复制
        我们通过取出binlog文件十六进制的第一行进行分析即可,因此即使binlog文件很大也是秒杀的。下面我们看下效果:
          [root@VM_0_6_centos binlog]# ll -lhrt
          total 163M
          -rw-r----- 1 mysql mysql 2.9K Mar 30 01:35 binlog.000082
          -rw-r----- 1 mysql mysql 2.0K Mar 30 01:54 binlog.000083
          -rw-r----- 1 mysql mysql 7.3K Mar 30 15:17 binlog.000084
          -rw-r----- 1 mysql mysql 148 Mar 30 15:17 binlog.index
          -rw-r----- 1 mysql mysql 163M Apr 1 14:07 binlog.000085
          [root@VM_0_6_centos binlog]# function getBinlogStartTime()
          > {
          > theFile="$1"
          > #取出文件头做分析
          > binlogHead=`hexdump ${theFile} | head -1`
          > #binlog文件校验
          > binlogCrc=`echo $binlogHead | awk '{print $1$2$3}'`
          > if [ "${binlogCrc}" != '000000062fe6e69' ]; then
          > echo '${theFile} is damage.'
          > exit 1
          > fi
          > #计算binlog的开始时间
          > binlogBeginTimeInt=`echo $binlogHead | awk '{print $5$4}' | gawk ' { printf strtonum("0x" $0)}' `
          > binlogBeginTime=`date -d "1970-01-01 UTC $binlogBeginTimeInt seconds" "+%F %T"`
          > echo $binlogBeginTime
          > }
          [root@VM_0_6_centos binlog]#
          [root@VM_0_6_centos binlog]# getBinlogStartTime binlog.000082
          2020-03-27 23:45:14
          [root@VM_0_6_centos binlog]# getBinlogStartTime binlog.000085
          2020-03-30 15:17:40
          [root@VM_0_6_centos binlog]#
          复制
          可以看到用这个函数可以很方便且快速的计算出binlog的开始时间,在我们需要遍历binlog文件去查找一些内容时,这个方法能大大提高效率。

          声明:本文首次发表在CSDN,详情请点击下方“阅读原文”

          长按下图二维码,关注更多数据库实用技巧。






          文章转载自小灯数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论