- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
之前写过一篇文章MySQL如何获取binlog的开始时间和结束时间[1],文章里面介绍了如何获取MySQL数据库二进制日志(binlog)的开始时间与结束时间的一些方法。实际应用当中,我们可能还会遇到效率/性能方面的问题。最近对这个问题做了一些研究,这里就介绍一下如何快速获取MySQL二进制日志(binlog)的开始时间和结束时间. 我们下来看看当MySQL二进制日志(binlog)的Size很大的时候,获取起开始时间和结束时间,如下测试所示 。 从上面实验可以看出,在MySQL二进制日志(binlog)变大的情况下,这种方法需要34秒,非常低效和耗时,那么我们怎么提升性能呢? 我们改写一下脚本,如下所示 。 如上所示,这样改进脚本后,性能效率已经提升到0.01秒,已经相当的高效了。那么获取结束时间能否也可以这样提升呢? 很遗憾的是由于MySQL二进制日志(binlog)的结束时间/滚动时间(Rotate Time)位于文件的末尾,由于管道的一些基本特性,获取MySQL二进制日志(binlog)的结束时间无法通过上面方法来优化,这里不打算介绍Linux管道相关概念,所以我们只需知道这么一个事实. 如果你对Linux管道的一些原理不是很清楚,那么就用实验测试验证一下,如下所示: 那么怎么来优化获取MySQL二进制日志(binlog)的结束时间呢?经过一番观察与实验,我发现一个MySQL二进制日志(binlog)的结束时间,就是下一个二进制日志(binlog)的开始时间。如下实验所示 。 如果全部符合这个规律的话,那么我们直接用下一个binlog的开始时间作为上一个binlog的结束时间即可,于是我写了一个脚本find_binlog_start_end_time.sh 如下测试所示 。 另外,还有一种比较高效的方法是解析二进制日志的头部信息(此篇文章统统指binlog v 4),因为binlog的头部由固定的4个字节组成,而头部信息的FORMAT_DESCRIPTION_EVENT部分包含了binlog的开始时间,我在搜索/学习相关资料时,结果发现有人已经总结过这方面的内容,而且已经有相关Python脚本或shell脚本了,这里就重复造轮子了,Python脚本来自MySQL 查询binlog生成时间[2]我们来看看实验结果,如下所示 。 shell脚本来自一种快速取得binlog开始时间的方法[3] 不过你看其脚本也会发现,解析MySQL的binlog的头部文件,比较容易获取binlog的开始时间,而获取binlog的结束时间/轮转时间就比较麻烦了。所以python脚本中获取binlog结束时间的思路跟我的思路也是一样的. 这里介绍了两种快速获取binlog的开始时间和结束时间的两种方法,这两种方法都非常高效,至于我写的脚本find_binlog_start_end_time.sh目前还比较粗糙,后面有时间再完善补充. 1: https://www.cnblogs.com/kerrycode/p/17377899.html 。 2: https://blog.csdn.net/qq_42768234/article/details/126970988 。 3: https://blog.csdn.net/shaochenshuo/article/details/120549377 。$ du -sh mysql_binlog.000105
1.1G mysql_binlog.000105
$ time mysqlbinlog mysql_binlog.000105 |grep "Start: binlog" | awk -F "server id" '{print $1}'
#240425 9:20:26
real 0m34.136s
user 0m25.941s
sys 0m11.985s$ time mysqlbinlog mysql_binlog.000105 | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'
#240425 9:20:26
real 0m0.010s
user 0m0.006s
sys 0m0.005s$ time mysqlbinlog mysql_binlog.000105 |grep Rotate | awk -F "server id" '{print $1}'
#240426 11:11:37
real 0m34.223s
user 0m27.202s
sys 0m11.551s
$ time mysqlbinlog mysql_binlog.000105 | tail -10 | grep Rotate | awk -F "server id" '{print $1}'
#240426 11:11:37
real 0m33.917s
user 0m25.528s
sys 0m11.395s[mysql@dbtest04 bin_logs]$ ls -lrt
total 28
-rw-r----- 1 mysql mysql 207 May 9 15:25 mysql_binlog.000055
-rw-r----- 1 mysql mysql 207 May 9 15:27 mysql_binlog.000056
-rw-r----- 1 mysql mysql 207 May 10 11:02 mysql_binlog.000057
-rw-r----- 1 mysql mysql 207 May 10 11:34 mysql_binlog.000058
-rw-r----- 1 mysql mysql 207 May 10 11:38 mysql_binlog.000059
-rw-r----- 1 mysql mysql 157 May 10 11:38 mysql_binlog.000060
-rw-r----- 1 mysql mysql 246 May 10 11:38 mysql_binlog.index
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000055 | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'
#240509 14:48:10
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000055 |grep Rotate | awk -F "server id" '{print $1}'
#240509 15:25:57
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000056 | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'
#240509 15:25:57
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000056 |grep Rotate | awk -F "server id" '{print $1}'
#240509 15:27:37
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000057 | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'
#240509 15:27:37
[mysql@dbtest04 bin_logs]$ mysqlbinlog mysql_binlog.000057 |grep Rotate | awk -F "server id" '{print $1}'
#240510 11:02:00
[mysql@dbtest04 bin_logs]$#!/bin/bash
#########################################################################################
# #
# This script is used for get the binlog start time and end time #
# #
#########################################################################################
# #
# ScriptName : find_binlog_start_end_time.sh #
# Author : Kerry #
# CreateDate : 2024-05-10 #
# Email : kerry2008code@qq.com #
#***************************************************************************************#
# 参数配置 #
#---------------------------------------------------------------------------------------#
# 脚本参数 binlog文件存放的路径 #
#---------------------------------------------------------------------------------------#
# MYSQLBINLOG mysqlbinlog的位置,以防没有设置环境变量 #
# BINLOG_BASENAME binlog的前缀名 #
#---------------------------------------------------------------------------------------#
# 注意事项: #
# 1:如果维护的MySQL数据库都规范化安装、配置的化,下面很多参数都不需要修改 #
#***************************************************************************************#
# Version Modified Date Description #
#***************************************************************************************#
# V.1.0 2024-05-10 创建此脚本 #
#########################################################################################
# mysqlbinlog的路径,一般无需设置,以防没有设置环境变量时
MYSQLBINLOG="/opt/mysql/mysql8.0/bin/mysqlbinlog"
BINLOG_BASENAME="mysql_binlog"
if [ $# = 0 ]
then
echo "find_binlog_start_end_time.sh Usage:"
echo "for eg: find_binlog_start_end_time.sh /data/mysql/binlogs"
exit
fi
BINLOG_FILE_PATH=$1
if [ ! -d $BINLOG_FILE_PATH ];then
echo "the folder $BINLOG_FILE_PATH does not exist, please check it!"
exit 1
fi
index=1
start_time=""
end_time=""
last_binlog_name=""
BINLOG_FILE_NUM=`ls -lrt $BINLOG_FILE_PATH | grep $BINLOG_BASENAME |grep -v $BINLOG_BASENAME.index | wc -l`
if [ $BINLOG_FILE_NUM -lt 1 ];then
echo "pelase check the binlog or the parameter of this script"
exit 1;
fi
cd $BINLOG_FILE_PATH
for binlog_file in `ls -rt | grep $BINLOG_BASENAME |grep -v $BINLOG_BASENAME.index`;
do
if [ $index -eq 1 ];then
start_time=`$MYSQLBINLOG $binlog_file | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'`
last_binlog_name=$binlog_file
else
end_time=`$MYSQLBINLOG $binlog_file | head -10 | grep "Start: binlog" | awk -F "server id" '{print $1}'`
echo "file name:$last_binlog_name" , "start time:$start_time", "end time:$end_time"
if [ $index -eq $BINLOG_FILE_NUM ];then
last_end_time=`$MYSQLBINLOG $binlog_file |tail -10 | egrep "Rotate|Stop" | awk -F "server id" '{print $1}'`
echo "file name:$binlog_file" , "start time:$end_time", "end time:$last_end_time"
else
start_time=$end_time
last_binlog_name=$binlog_file
fi
fi
let index++
done[mysql@dbtest04 kerry]$ sh find_binlog_start_end_time.sh /data/mysql/bin_logs/
file name:mysql_binlog.000055 , start time:#240509 14:48:10 , end time:#240509 15:25:57
file name:mysql_binlog.000056 , start time:#240509 15:25:57 , end time:#240509 15:27:37
file name:mysql_binlog.000057 , start time:#240509 15:27:37 , end time:#240510 11:02:00
file name:mysql_binlog.000058 , start time:#240510 11:02:00 , end time:#240510 11:34:01
file name:mysql_binlog.000059 , start time:#240510 11:34:01 , end time:#240510 11:38:24
file name:mysql_binlog.000060 , start time:#240510 11:38:24 , end time:#240510 16:45:34
file name:mysql_binlog.000061 , start time:#240510 16:45:34 , end time:$ python3 check_bintime.py /data/mysql/bin_logs/mysql_binlog.index
{'file_name': 'mysql_binlog.000055', 'binlog_size': '207.0 B', 'start_time': '2024-05-09 14:48:10', 'end_time': '2024-05-09 15:25:57'}
{'file_name': 'mysql_binlog.000056', 'binlog_size': '207.0 B', 'start_time': '2024-05-09 15:25:57', 'end_time': '2024-05-09 15:27:37'}
{'file_name': 'mysql_binlog.000057', 'binlog_size': '207.0 B', 'start_time': '2024-05-09 15:27:37', 'end_time': '2024-05-10 11:02:00'}
{'file_name': 'mysql_binlog.000058', 'binlog_size': '207.0 B', 'start_time': '2024-05-10 11:02:00', 'end_time': '2024-05-10 11:34:01'}
{'file_name': 'mysql_binlog.000059', 'binlog_size': '207.0 B', 'start_time': '2024-05-10 11:34:01', 'end_time': '2024-05-10 11:38:24'}
{'file_name': 'mysql_binlog.000060', 'binlog_size': '180.0 B', 'start_time': '2024-05-10 11:38:24', 'end_time': '2024-05-10 16:45:34'}
{'file_name': 'mysql_binlog.000061', 'binlog_size': '157.0 B', 'start_time': '2024-05-10 16:45:34', 'end_time': 'now'}[mysql@dbtest04 kerry]$ 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
> }
[mysql@dbtest04 kerry]$ getBinlogStartTime /data/mysql/bin_logs/mysql_binlog.000055
2024-05-09 14:48:10总结:
参考资料
最后此篇关于MySQL如何快速获取binlog的开始时间和结束时间的文章就讲到这里了,如果你想了解更多关于MySQL如何快速获取binlog的开始时间和结束时间的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!