禾口 發表於 2025-7-28 08:21:00

分享一个 MySQL binlog 分析小工具

<p data-tool="mdnice编辑器"><span>去年写的一个小工具,用于在线获取 MySQL binlog 的大小、开始时间、结束时间和持续时长。</span></p>
<p data-tool="mdnice编辑器"><span>什么场景下会用上这个工具呢?</span></p>
<ol class="list-paddingleft-1">
<li><span>云服务场景,无法登录 MySQL 服务器查看 binlog 的时间戳信息。</span></li>
<li><span>主从延迟时,可以使用这个工具来查看 binlog 的大小或者某个时间段 binlog 的写入量。</span></li>
<li><span>基于时间点的恢复时,可以根据操作的大致时间来定位对应的 binlog 文件。</span></li>
</ol>
<p data-tool="mdnice编辑器"><span>不多说,直接看看工具的效果。</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span>./mysql-binlog-time-extractor -h 10.0.0.108 -P 3306 -u root -p 123456<span><br><span>+------------------+--------------------+---------------------+---------------------+-----------+---------+<span><br><span>| &nbsp; &nbsp; Log_name &nbsp; &nbsp; | &nbsp; &nbsp; File_size &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; Start_time &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp;End_time &nbsp; &nbsp; &nbsp; | Duration &nbsp;| &nbsp;GTID &nbsp; |<span><br><span>+------------------+--------------------+---------------------+---------------------+-----------+---------+<span><br><span>| mysql-bin.000046 | 805 (805.00 bytes) | 2025-06-22 11:09:38 | 2025-06-24 10:33:59 | 47:24:21 &nbsp;| 503-504 |<span><br><span>| mysql-bin.000047 | 12103 (11.82 KB) &nbsp; | 2025-06-24 10:33:59 | 2025-07-05 00:02:27 | 253:28:28 | 505-517 |<span><br><span>| mysql-bin.000048 | 261 (261.00 bytes) | 2025-07-05 00:02:27 | 2025-07-10 15:03:01 | 135:00:34 | &nbsp; &nbsp; &nbsp; &nbsp; |<span><br><span>| mysql-bin.000049 | 261 (261.00 bytes) | 2025-07-10 15:03:01 | 2025-07-10 15:05:29 | 00:02:28 &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; |<span><br><span>| mysql-bin.000050 | 9074 (8.86 KB) &nbsp; &nbsp; | 2025-07-10 15:05:29 | 2025-07-23 12:20:32 | 309:15:03 | 518-550 |<span><br><span>| mysql-bin.000051 | 586710 (572.96 KB) | 2025-07-23 12:20:32 | 2025-07-24 08:48:08 | 20:27:36 &nbsp;| 551-754 |<span><br><span>| mysql-bin.000052 | 464 (464.00 bytes) | 2025-07-24 08:48:08 | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; |<span><br><span>+------------------+--------------------+---------------------+---------------------+-----------+---------+<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h1 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">工具地址</span></h1>
<p data-tool="mdnice编辑器"><span>项目地址:https://github.com/slowtech/mysql-binlog-time-extractor</span></p>
<p data-tool="mdnice编辑器"><span>可直接使用二进制包,也可以源码编译。</span></p>
<h3 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">直接使用二进制包</span></h3>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code># wget https://github.com/slowtech/mysql-binlog-time-extractor/releases/download/v1.0.0/mysql-binlog-time-extractor-linux-amd64.tar.gz<span><br># tar xvf mysql-binlog-time-extractor-linux-amd64.tar.gz<span><br></span></span></code></span></pre>
<p data-tool="mdnice编辑器"><span>解压后,会在当前目录生成一个名为<code><span>mysql-binlog-time-extractor</span></code><span>的可执行文件。</span></span></p>
<h3 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">源码编译</span></h3>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code># wget https://github.com/slowtech/mysql-binlog-time-extractor/archive/refs/tags/v1.0.0.tar.gz<span><br># tar xvf v1.0.0.tar.gz&nbsp;<span><br># cd mysql-binlog-time-extractor-1.0.0/<span><br># go build<span><br></span></span></span></span></code></span></pre>
<p data-tool="mdnice编辑器"><span>编译完成后,会在当前目录生成一个名为<code><span>mysql-binlog-time-extractor</span></code><span>的可执行文件。</span></span></p>
<h1 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">参数解析</span></h1>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code># ./mysql-binlog-time-extractor --help<span><br><span>Usage of ./mysql-binlog-time-extractor:<span><br><span>&nbsp; -P int<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; MySQL port (default 3306)<span><br><span>&nbsp; -h string<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; MySQL host (default&nbsp;"localhost"<span>)<span><br><span>&nbsp; -n int<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; Number of goroutines to run concurrently (default 5)<span><br><span>&nbsp; -p string<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; MySQL password<span><br><span>&nbsp; -u string<span><br><span>&nbsp; &nbsp; &nbsp; &nbsp; MySQL user (default&nbsp;"root"<span>)<span><br><span>&nbsp; -v &nbsp; &nbsp;Enable verbose logging<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p data-tool="mdnice编辑器"><span>其中,-h、-P、-u、-p 分别用来指定实例的 IP、端口、用户名和密码。如果不指定 -p,则会提示输入密码。</span></p>
<p data-tool="mdnice编辑器"><span>-n 是并发数,默认是 5,即每次会同时分析 5 个 binlog。在 binlog 数量较多的情况下,可以适当增加并发数来提高分析效率。</span></p>
<p data-tool="mdnice编辑器"><span>-v 打印分析进度,例如,</span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span> mysql_binlog_time_extractor.go SHOW BINARY LOGS&nbsp;done<span>, 7 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000052&nbsp;done<span>, still 6 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000051&nbsp;done<span>, still 5 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000050&nbsp;done<span>, still 4 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000049&nbsp;done<span>, still 3 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000048&nbsp;done<span>, still 2 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000047&nbsp;done<span>, still 1 binlogs to analyze<span><br><span> mysql_binlog_time_extractor.go mysql-bin.000046&nbsp;done<span>, still 0 binlogs to analyze<span><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h1 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">实现原理</span></h1>
<ol class="list-paddingleft-1">
<li>
<p><span>首先执行&nbsp;<code><span>SHOW BINARY LOGS</span></code><span>,获取所有 binlog 文件的列表,包括文件名和文件大小。</span></span></p>
</li>
<li>
<p><span>将自己“伪装”为从库,逐个分析每个 binlog 文件的前两个事件:<code><span>FORMAT_DESCRIPTION_EVENT</span></code><span>&nbsp;和&nbsp;<code><span>PREVIOUS_GTIDS_EVENT</span></code><span>。</span></span></span></p>
<p><span>其中,<code><span>FORMAT_DESCRIPTION_EVENT</span></code><span>&nbsp;记录了 binlog 的创建时间,<code><span>PREVIOUS_GTIDS_EVENT</span></code><span>&nbsp;记录了当前 binlog 之前的所有 GTID 集合。</span></span></span></p>
</li>
<li>
<p><span>为了提升分析效率并减少对主库的影响,该工具只会分析每个 binlog 文件的前两个事件。那么,如何确定当前 binlog 的结束时间呢?这里采用了一种巧妙的方式:直接使用下一个 binlog 的创建时间作为当前 binlog 的结束时间,而不是扫描所有事件来获取最后一个事件的时间。</span></p>
</li>
</ol>
<h1 data-tool="mdnice编辑器"><span style="color: rgba(0, 128, 0, 1)">注意事项</span></h1>
<p data-tool="mdnice编辑器"><span>工具执行过程中,可能会打印以下错误,表示在尝试关闭 binlog streamer 时,发现其已处于关闭状态。该错误来自第三方库&nbsp;<code><span>github.com/go-mysql-org/go-mysql/replication</span></code><span>,不影响工具的正常使用,可忽略。</span></span></p>
<pre data-tool="mdnice编辑器"><span data-cacheurl="" data-remoteid="" data-lazy-bgimg="https://mmbiz.qpic.cn/mmbiz_svg/BO1qQiajiacVll2lZZ7QEHpTZKPbLAiaUSyruLfEj4rddcibqO0nia2Q8XnDN8KuZRQm7k2TEQGDkOSeCibqho5zmChvG90sIfk1Jr/640?wx_fmt=svg&amp;from=appmsg" data-fail="0"><code><span> binlogstreamer.go:78 close sync with err: sync is been closing...</span></code></span></pre><br><br>
来源:https://www.cnblogs.com/ivictor/p/19008238
頁: [1]
查看完整版本: 分享一个 MySQL binlog 分析小工具