一种快速取得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”。我们这个binlog.000082很小,只有2.9K,这种方法也是很快的,但如果我们要查看的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的开始时间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值