温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL怎么查询Binlog生成时间

发布时间:2023-03-21 17:20:07 阅读:168 作者:iii 栏目:开发技术
亿速云mysql数据库,读写分离,安全稳定,弹性扩容,低至0.3元/天!! 点击查看>>

这篇文章主要介绍“MySQL怎么查询Binlog生成时间”,在日常操作中,相信很多人在MySQL怎么查询Binlog生成时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL怎么查询Binlog生成时间”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

脚本介绍

直接上代码吧~

通过读取 Binlog FORMAT_DESCRIPTION_EVENT header 时间戳来实现读取 Binlog 生产时间。

# -*- coding: utf-8 -*-
import os
import sys
import math
import time
import struct
import argparse

binlog_quer_event_stern = 4
binlog_event_fix_part = 13
table_map_event_fix_length = 8
BINLOG_FILE_HEADER = b'\xFE\x62\x69\x6E'
binlog_event_header_len = 19


class BinlogTimestamp(object):
    def __init__(self, index_path):
        self.index_path = index_path

    def main(self):
        binlog_info_list = list()
        for file_path in self.reed_index_file():
            result = self.read_binlog_pos(file_path)
            binlog_info_list.append({
                'file_name': result[0],
                'binlog_size': result[2],
                'start_time': result[1]
            })
        # print
        i = 0

        while len(binlog_info_list) > i:
            if i + 1 == len(binlog_info_list):
                end_time = 'now'
            else:
                end_time = binlog_info_list[i + 1]['start_time']

            binlog_info_list[i]['end_time'] = end_time
            print(binlog_info_list[i])
            i += 1

    def read_binlog_pos(self, binlog_path):
        binlog_file_size = self.bit_conversion(os.path.getsize(binlog_path))
        file_name = os.path.basename(binlog_path)
        with open(binlog_path, 'rb'as r:
            # read BINLOG_FILE_HEADER
            if not r.read(4) == BINLOG_FILE_HEADER:
                print("Error: Is not a standard binlog file format.")
                sys.exit(0)

            # read binlog header FORMAT_DESCRIPTION_EVENT
            read_byte = r.read(binlog_event_header_len)
            result = struct.unpack('=IBIIIH', read_byte)
            type_code, event_length, event_timestamp, next_position = result[1], result[3], result[0], result[4]
            binlog_start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(event_timestamp))

        return file_name, binlog_start_time, binlog_file_size

    def reed_index_file(self):
        """
        读取 mysql-bin.index 文件
        select @@log_bin_index;
        :return:
        """
        with open(self.index_path) as r:
            content = r.readlines()

        return [x.replace('\n'''for x in content]

    @staticmethod
    def bit_conversion(size, dot=2):
        size = float(size)
        if 0 <= size < 1:
            human_size = str(round(size / 0.125, dot)) + ' b'
        elif 1 <= size < 1024:
            human_size = str(round(size, dot)) + ' B'
        elif math.pow(10241) <= size < math.pow(10242):
            human_size = str(round(size / math.pow(10241), dot)) + ' KB'
        elif math.pow(10242) <= size < math.pow(10243):
            human_size = str(round(size / math.pow(10242), dot)) + ' MB'
        elif math.pow(10243) <= size < math.pow(10244):
            human_size = str(round(size / math.pow(10243), dot)) + ' GB'
        elif math.pow(10244) <= size < math.pow(10245):
            human_size = str(round(size / math.pow(10244), dot)) + ' TB'
        elif math.pow(10245) <= size < math.pow(10246):
            human_size = str(round(size / math.pow(10245), dot)) + ' PB'
        elif math.pow(10246) <= size < math.pow(10247):
            human_size = str(round(size / math.pow(10246), dot)) + ' EB'
        elif math.pow(10247) <= size < math.pow(10248):
            human_size = str(round(size / math.pow(10247), dot)) + ' ZB'
        elif math.pow(10248) <= size < math.pow(10249):
            human_size = str(round(size / math.pow(10248), dot)) + ' YB'
        elif math.pow(10249) <= size < math.pow(102410):
            human_size = str(round(size / math.pow(10249), dot)) + ' BB'
        elif math.pow(102410) <= size < math.pow(102411):
            human_size = str(round(size / math.pow(102410), dot)) + ' NB'
        elif math.pow(102411) <= size < math.pow(102412):
            human_size = str(round(size / math.pow(102411), dot)) + ' DB'
        elif math.pow(102412) <= size:
            human_size = str(round(size / math.pow(102412), dot)) + ' CB'
        else:
            raise ValueError('bit_conversion Error')
        return human_size


if __name__ == '__main__':
    file_name = sys.argv[1]

    bt = BinlogTimestamp(file_name)
    bt.main()

使用案例

1. 查询 binlog index 文件

MySQL怎么查询Binlog生成时间

2. 使用脚本查询时间

脚本上传到 MySQL 服务器后,指定 binlog index 文件位置即可:

python check_bintime.py /data/mysql_57/logs/mysql-bin.index

MySQL怎么查询Binlog生成时间

MySQL怎么查询Binlog生成时间

到此,关于“MySQL怎么查询Binlog生成时间”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

亿速云「云数据库 MySQL」免部署即开即用,比自行安装部署数据库高出1倍以上的性能,双节点冗余防止单节点故障,数据自动定期备份随时恢复。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://blog.csdn.net/qq_42768234/article/details/126970988

AI

开发者交流群×