去年写的一个小工具,用于在线获取 MySQL binlog 的大小、开始时间、结束时间和持续时长。

什么场景下会用上这个工具呢?

  1. 云服务场景,无法登录 MySQL 服务器查看 binlog 的时间戳信息。
  2. 主从延迟时,可以使用这个工具来查看 binlog 的大小或者某个时间段 binlog 的写入量。
  3. 基于时间点的恢复时,可以根据操作的大致时间来定位对应的 binlog 文件。

不多说,直接看看工具的效果。

./mysql-binlog-time-extractor -h 10.0.0.108 -P 3306 -u root -p 123456
+------------------+--------------------+---------------------+---------------------+-----------+---------+
|     Log_name     |     File_size      |     Start_time      |      End_time       | Duration  |  GTID   |
+------------------+--------------------+---------------------+---------------------+-----------+---------+
| mysql-bin.000046 | 805 (805.00 bytes) | 2025-06-22 11:09:38 | 2025-06-24 10:33:59 | 47:24:21  | 503-504 |
| mysql-bin.000047 | 12103 (11.82 KB)   | 2025-06-24 10:33:59 | 2025-07-05 00:02:27 | 253:28:28 | 505-517 |
| mysql-bin.000048 | 261 (261.00 bytes) | 2025-07-05 00:02:27 | 2025-07-10 15:03:01 | 135:00:34 |         |
| mysql-bin.000049 | 261 (261.00 bytes) | 2025-07-10 15:03:01 | 2025-07-10 15:05:29 | 00:02:28  |         |
| mysql-bin.000050 | 9074 (8.86 KB)     | 2025-07-10 15:05:29 | 2025-07-23 12:20:32 | 309:15:03 | 518-550 |
| mysql-bin.000051 | 586710 (572.96 KB) | 2025-07-23 12:20:32 | 2025-07-24 08:48:08 | 20:27:36  | 551-754 |
| mysql-bin.000052 | 464 (464.00 bytes) | 2025-07-24 08:48:08 |                     |           |         |
+------------------+--------------------+---------------------+---------------------+-----------+---------+

工具地址

项目地址:https://github.com/slowtech/mysql-binlog-time-extractor

可直接使用二进制包,也可以源码编译。

直接使用二进制包

# wget https://github.com/slowtech/mysql-binlog-time-extractor/releases/download/v1.0.0/mysql-binlog-time-extractor-linux-amd64.tar.gz
# tar xvf mysql-binlog-time-extractor-linux-amd64.tar.gz

解压后,会在当前目录生成一个名为mysql-binlog-time-extractor的可执行文件。

源码编译

# wget https://github.com/slowtech/mysql-binlog-time-extractor/archive/refs/tags/v1.0.0.tar.gz
# tar xvf v1.0.0.tar.gz 
# cd mysql-binlog-time-extractor-1.0.0/
# go build

编译完成后,会在当前目录生成一个名为mysql-binlog-time-extractor的可执行文件。

参数解析

# ./mysql-binlog-time-extractor --help
Usage of ./mysql-binlog-time-extractor:
  -P int
        MySQL port (default 3306)
  -h string
        MySQL host (default "localhost")
  -n int
        Number of goroutines to run concurrently (default 5)
  -p string
        MySQL password
  -u string
        MySQL user (default "root")
  -v    Enable verbose logging

其中,-h、-P、-u、-p 分别用来指定实例的 IP、端口、用户名和密码。如果不指定 -p,则会提示输入密码。

-n 是并发数,默认是 5,即每次会同时分析 5 个 binlog。在 binlog 数量较多的情况下,可以适当增加并发数来提高分析效率。

-v 打印分析进度,例如,

[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go SHOW BINARY LOGS done, 7 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000052 done, still 6 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000051 done, still 5 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000050 done, still 4 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000049 done, still 3 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000048 done, still 2 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000047 done, still 1 binlogs to analyze
[2025/07/25 00:02:29] [info] mysql_binlog_time_extractor.go mysql-bin.000046 done, still 0 binlogs to analyze

实现原理

  1. 首先执行 SHOW BINARY LOGS,获取所有 binlog 文件的列表,包括文件名和文件大小。

  2. 将自己“伪装”为从库,逐个分析每个 binlog 文件的前两个事件:FORMAT_DESCRIPTION_EVENT 和 PREVIOUS_GTIDS_EVENT

    其中,FORMAT_DESCRIPTION_EVENT 记录了 binlog 的创建时间,PREVIOUS_GTIDS_EVENT 记录了当前 binlog 之前的所有 GTID 集合。

  3. 为了提升分析效率并减少对主库的影响,该工具只会分析每个 binlog 文件的前两个事件。那么,如何确定当前 binlog 的结束时间呢?这里采用了一种巧妙的方式:直接使用下一个 binlog 的创建时间作为当前 binlog 的结束时间,而不是扫描所有事件来获取最后一个事件的时间。

注意事项

工具执行过程中,可能会打印以下错误,表示在尝试关闭 binlog streamer 时,发现其已处于关闭状态。该错误来自第三方库 github.com/go-mysql-org/go-mysql/replication,不影响工具的正常使用,可忽略。

[2025/07/25 02:57:38] [error] binlogstreamer.go:78 close sync with err: sync is been closing...

分享一个 MySQL binlog 分析小工具的更多相关文章

  1. MySQL数据归档小工具推荐--mysql_archiver

    一.主要概述 MySQL数据库归档历史数据主要可以分为三种方式:一.创建编写SP.设置Event:二.通过dump导入导出:三.通过pt-archiver工具进行归档.第一种方式往往受限于同实例要求, ...

  2. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

  3. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码

    开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码. 开源地址: https://github.com/jkpang/PPRows

  4. 用 C# 写一个 Redis 数据同步小工具

    用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...

  5. 分享一个mysql服务启动与关闭的bat文件

    有时候打开数据库可视化工具(sqlyog.navicat)连接数据库时,会出现以下报错信息. 大家都知道是数据库的服务没有启动. 所以我想给大家分享一个bat文件可供快速启动mysql的数据库的服务, ...

  6. mysqlslap 一个MySQL数据库压力测试工具

    在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...

  7. 自己动手写一个U盘拷贝小工具

    这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...

  8. (win环境)使用Electron打造一个桌面应用翻译小工具

    初始化项目 npm init 修改package.json {"name": "trans","version": "1.0.0& ...

  9. 分享一个nodejs写的小论坛

    引言:作为一个前端小菜鸟,最近迷上了node,于是乎空闲时间,为了练练手写了一个node的小社区,关于微信小程序的,欢迎大家批评指导. 项目架构部分 一.前端架构 作为一个写样式也得无聊的前端狮,我偷 ...

  10. 分享一个JDK批量异步任务工具CompletionService,超好用

    摘要:当需要批量提交异步任务,推荐CompletionService.CompletionService将线程池Executor和阻塞队列融合,让批量异步任务管理更简单. 本文分享自华为云社区< ...

随机推荐

  1. 移动端H5页面在不同Android和iOS设备上的兼容适配

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  2. JS中常用方法

    数组 splice: splice() 方法的第一个参数是起始索引,第二个参数是要删除的元素数量(可以为0),然后可以传递更多的参数作为要插入的新元素. 限制删除的数量: const arr = [1 ...

  3. wireshark的所有入门指令(总结与摘要)

    wireshark的所有指令 常用捕获过滤器 1.基于IP地址进行捕获 host 10.3.1.1 dst host 10.3.1.1 net 192.168.1.0/24 net 192.168.1 ...

  4. 又一版 A+B

    Description 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. Input 输入格式:测试输入包含若干测试用 ...

  5. CAD如何使用 “库” 和 “打开文件菜单栏” 和 “项目管理器”

    这个是一个简单的问题,就是库工具栏丢了怎么办? 点击 默认-块-插入-库中的块,这个菜单栏就会恢复了 打开文件菜单栏,有些同学的菜单栏默认是不存在的,需要特殊功能时可以使用命令行MANUBAR使其显现 ...

  6. ODOO14里面qweb使用案例

    在ODOO里面中,通过QWeb来对模板进行渲染后加载到浏览器中,故作笔记以便于查询简介:Qweb被用作OpenERP的Web客户端模板引擎.它是一种基于XML的模板语言,同Genshi, Thymel ...

  7. 代码随想录第七天 | 字符串part01

    最近这两天上班回去真的有点晚不想动了,趁着周末有时间赶快补补: 344.反转字符串 建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么 ...

  8. 【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第二周作业

    [吴恩达课后编程作业]Course 1 - 神经网络和深度学习 - 第二周作业 - 具有神经网络思维的Logistic回归 上一篇:[课程1 - 第二周测验]※※※※※ [回到目录]※※※※※下一篇: ...

  9. Git镜像网站和Git网站提速方法

    最近开始学习使用git,但是因为git是国外的网站,所以基本就是无法访问.如下图: 通过在网上查找资料,我发现了几个访问git的方法. 方法一.通过镜像网站 镜像网站一: https://github ...

  10. CAN304 W2

    CAN304 W2 Classical and modern cryptography Classical cryptography 完全依赖于通信双方之间共享的秘密信息(Private-key cr ...