MySQL如何查詢Binlog 生成時(shí)間
前言
本篇文章介紹如何查詢 Binlog 的生成時(shí)間。云上 RDS 有日志管理,但是自建實(shí)例沒有,該腳本可用于自建實(shí)例閃回定位 Binlog 文件。
腳本介紹
直接上代碼吧~
通過讀取 Binlog FORMAT_DESCRIPTION_EVENT header 時(shí)間戳來實(shí)現(xiàn)讀取 Binlog 生產(chǎn)時(shí)間。
# -*- 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(1024, 1) <= size < math.pow(1024, 2): human_size = str(round(size / math.pow(1024, 1), dot)) + ' KB' elif math.pow(1024, 2) <= size < math.pow(1024, 3): human_size = str(round(size / math.pow(1024, 2), dot)) + ' MB' elif math.pow(1024, 3) <= size < math.pow(1024, 4): human_size = str(round(size / math.pow(1024, 3), dot)) + ' GB' elif math.pow(1024, 4) <= size < math.pow(1024, 5): human_size = str(round(size / math.pow(1024, 4), dot)) + ' TB' elif math.pow(1024, 5) <= size < math.pow(1024, 6): human_size = str(round(size / math.pow(1024, 5), dot)) + ' PB' elif math.pow(1024, 6) <= size < math.pow(1024, 7): human_size = str(round(size / math.pow(1024, 6), dot)) + ' EB' elif math.pow(1024, 7) <= size < math.pow(1024, 8): human_size = str(round(size / math.pow(1024, 7), dot)) + ' ZB' elif math.pow(1024, 8) <= size < math.pow(1024, 9): human_size = str(round(size / math.pow(1024, 8), dot)) + ' YB' elif math.pow(1024, 9) <= size < math.pow(1024, 10): human_size = str(round(size / math.pow(1024, 9), dot)) + ' BB' elif math.pow(1024, 10) <= size < math.pow(1024, 11): human_size = str(round(size / math.pow(1024, 10), dot)) + ' NB' elif math.pow(1024, 11) <= size < math.pow(1024, 12): human_size = str(round(size / math.pow(1024, 11), dot)) + ' DB' elif math.pow(1024, 12) <= size: human_size = str(round(size / math.pow(1024, 12), 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 文件
2. 使用腳本查詢時(shí)間
腳本上傳到 MySQL 服務(wù)器后,指定 binlog index 文件位置即可:
python check_bintime.py /data/mysql_57/logs/mysql-bin.index
到此這篇關(guān)于MySQL如何查詢Binlog 生成時(shí)間的文章就介紹到這了,更多相關(guān)mysql查詢Binlog 生成時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows10 mysql 8.0.12 非安裝版配置啟動(dòng)方法
這篇文章主要為大家詳細(xì)介紹了Windows10 mysql 8.0.12 非安裝版配置啟動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Windows系統(tǒng)下MySQL8.0.21安裝教程(圖文詳解)
這篇文章主要介紹了Windows系統(tǒng)下MySQL8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08MySQL數(shù)據(jù)庫的shell腳本自動(dòng)備份
這篇文章主要介紹了MySQL數(shù)據(jù)庫的shell腳本自動(dòng)備份的相關(guān)資料,網(wǎng)站或應(yīng)用的后臺(tái)都有備份數(shù)據(jù)庫的功能按鈕,但需要去手工執(zhí)行。我們需要一種安全的,每天自動(dòng)備份的方法需要的朋友可以參考下2017-03-03MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解
這個(gè)問題是我在學(xué)習(xí)數(shù)據(jù)庫的時(shí)候遇到的一個(gè)問題,我當(dāng)時(shí)并不能理解下圖中的一些情況,后來我也請(qǐng)教了一位大佬給我解答,最后在大佬和度娘的幫助下我大概理解了這個(gè)反引號(hào)的東西2021-10-10Mysql中實(shí)現(xiàn)提取字符串中的數(shù)字的自定義函數(shù)分享
這篇文章主要介紹了Mysql中實(shí)現(xiàn)提取字符串中的數(shù)字的自定義函數(shù)分享,通常這種問題是在編程語言中實(shí)現(xiàn),本文使用自定義SQL函數(shù)實(shí)現(xiàn),需要的朋友可以參考下2014-10-10