工具分享丨分析GreatSQL Binglog神器

来源:https://www.cnblogs.com/greatsql/p/18093853
-Advertisement-
Play Games

在GreatSQL中,Binlog可以說是 GreatSQL 中比較重要的日誌了,在日常開發及運維過程中經常會遇到。Binlog即Binary Log,二進位日誌文件,也叫作變更日誌(Update Log)。 詳細Binglog日誌介紹 Binglog主要應用於數據恢復和數據複製,但是在Binlog ...


file

在GreatSQL中,Binlog可以說是 GreatSQL 中比較重要的日誌了,在日常開發及運維過程中經常會遇到。Binlog即Binary Log,二進位日誌文件,也叫作變更日誌(Update Log)。

詳細Binglog日誌介紹

Binglog主要應用於數據恢復和數據複製,但是在Binlog中也含有非常多有價值的信息,比如說:

  • 數據修改事件
  • 表結構修改事件
  • 狀態修改事件
  • 事務控制事件
  • 管理語句事件
  • ......

事務控制事件涵蓋了事務的起始時間、起始位置、結束時間和結束位置。通過這些詳細信息,我們能夠計算事務的大小,進而評估其是否屬於大型事務,以及是否可能引起主從同步的延遲問題,及時發現大事務,可避免複製故障。

簡介

本文分享的神器的名字就叫做binlog_summary,出自陳臣老師的手筆,也是開源的Python腳本文件,開源地址

下載

運行此工具需要有Python環境,若沒有python環境請自行下載

下載binlog_summary.py腳本,並授權

$ wget https://raw.githubusercontent.com/slowtech/dba-toolkit/master/mysql/binlog_summary.py
$ chmod 755 binlog_summary.py

先用./binlog_summary.py -h查看下幫助

$ ./binlog_summary.py -h
usage: binlog_summary.py [-h] [-f BINLOG_TEXT_FILE] [--new] [-c {tps,opr,transaction}] [--start START_DATETIME] [--stop STOP_DATETIME] [--sort SORT_CONDITION] [-e]
                         [--limit LIMIT]

options:
  -h, --help            show this help message and exit
  -f BINLOG_TEXT_FILE, --file BINLOG_TEXT_FILE
                        Binlog text file, not the Raw binary file
  --new                 Make a fresh start
  -c {tps,opr,transaction}, --command {tps,opr,transaction}
                        Command type: [tps, opr, transaction],tps: transaction per second, opr: dml per table, transaction: show transaction info
  --start START_DATETIME
                        Start datetime, for example: 2004-12-25 11:25:56
  --stop STOP_DATETIME  Stop datetime, for example: 2004-12-25 11:25:56
  --sort SORT_CONDITION
                        Sort condition: time or size, you can use it when command type is transaction
  -e, --extend          Show transaction info in detail,you can use it when command type is transaction
  --limit LIMIT         Limit the number of rows to display

其中參數介紹:

  • -f:Binlog 通過 mysqlbinlog 解析後的文本文件。註意,是文本文件,不是Binlog原始文件。

  • --new:工具輸出預設存儲在sqlite3資料庫中。使用--new可刪除舊資料庫。分析新binlog時需指定。

  • -c:指定命令的類型。支持的命令類型有:

    • tps:分析實例的TPS信息
    • opr:分析表的操作情況
    • transaction:分析事務信息
  • --start/--stop:指定時間範圍

  • --sort:事務排序方式,僅針對-c選擇為transaction模式

    • size,按事務大小排序
    • time,按事務的持續時間排序
  • -e:輸出事務詳細操作信息,僅針對-c選擇為transaction模式

  • limit:限制輸出的行數。

最佳實踐

前置工作

由於工具只支持解析經mysqlbinlog處理後的文本文件,首先需要進行解析轉換。

先從GreatSQL數據目錄中複製一份需要分析的binlog文件。

$ cp /data/GreatSQL/binlog.000021 ./
$ du -h binlog.000021 
2.0G    binlog.000021

先使用 mysqlbinlog 解析 Binlog

  • 推薦使用參數-v(偽SQL)和--base64-output=decode-rows(不顯示Base64編碼結果),這樣生成的文本文件最小,相應地,binlog_summary工具的解析速度也會更快。
$ mysqlbinlog --base64-output=decode-rows -v binlog.000021 > ./greatsql-bin.000001.txt

解析後的文件大小大概在1.7G左右

$ du -h greatsql-bin.000001.txt            
1.7G    greatsql-bin.000001.txt

分析實例的TPS信息

使用-f指定解析後的文件,-c選擇分析TPS信息,--limit選擇只顯示5行

$ ./binlog_summary.py -f ./greatsql-bin.000001.txt -c tps --limit 5
COMMIT_TIME        TPS                
2024-02-04 14:28:45 1                  
2024-02-04 14:28:56 1                  
2024-02-04 14:28:57 2                  
2024-02-04 14:28:58 1                  
2024-02-04 14:28:59 1

這裡TPS是根據事務的提交時間進行統計的。獲取如此精細TPS信息通常需要通過Binlog來實現,一般的監控手段難以達到如此精細的水平

當然,也可以對TPS進行排序,只需要加上管道和sort。

  • k:對第三列排序
  • n:是按照數值(預設是字元)的大小進行排序
  • r:進行逆序排序
$ ./binlog_summary.py -f ./greatsql-bin.000001.txt -c tps --limit 5 | sort -k 3 -n 
COMMIT_TIME        TPS                
2024-02-04 14:28:45 1                  
2024-02-04 14:28:56 1                  
2024-02-04 14:28:58 1                  
2024-02-04 14:28:59 1                  
2024-02-04 14:28:57 2

分析表的操作情況

如果要分析表操作情況,需要-c選擇opr功能模式,NUMS是執行次數,DML_TYPE是執行SQL的類型

$ ./binlog_summary.py -f ./greatsql-bin.000001.txt -c opr --limit 5
TABLE_NAME         DML_TYPE           NUMS               
test_db.idx_test   INSERT             10000001           
aptest.sys_user    INSERT             1002000            
test_db.t1         INSERT             524288             
aptest.sys_dept    INSERT             101000             
aptest.sys_user    DELETE             1000

分析Binlog中的大事務

$ ./binlog_summary.py -f ./greatsql-bin.000001.txt -c transaction --sort size --limit 5
TRANS_NAME         BEGIN_TIME         COMMIT_TIME        BEGIN_LOG_POS      COMMIT_LOG_POS     DURATION_TIME      SIZE               
t21                2024-02-05 16:14:32 2024-02-05 16:23:53 14319911           869025248          561                854705337          
t33                2024-02-20 16:02:41 2024-02-20 16:08:21 913362031          1425529317         340                512167286          
t32                2024-02-20 16:01:37 2024-02-20 16:02:06 881773547          913361946          29                 31588399           
t31                2024-02-20 16:00:14 2024-02-20 16:00:15 871100835          881773462          1                  10672627           
t20                2024-02-04 14:29:43 2024-02-04 14:29:43 7163617            14319264           0                  7155647

其中,各個參數解析如下

  • TRANS_NAME:事務編號
  • BEGIN_TIME:事務開始時間
  • COMMIT_TIME:事務提交時間
  • BEGIN_LOG_POS:事務的開始位置點
  • COMMIT_LOG_POS:事務的結束位置點
  • DURATION_TIME:事務的持續時間,單位秒。其中,DURATION_TIME = COMMIT_TIME - BEGIN_TIME
  • SIZE:事務的大小,單位位元組,其中,SIZE = COMMIT_LOG_POS - BEGIN_LOG_POS

拿到事務的大小,可以粗略地判斷這個Binlog中是否存在大事務。如果要進一步分析事務中包含哪些操作,需加上–extend,如:

$ ./binlog_summary.py -f ./greatsql-bin.000001.txt -c transaction --sort size --extend --limit 5
TRANS_NAME      BEGIN_TIME           COMMIT_TIME          BEGIN_LOG_POS   COMMIT_LOG_POS  DURATION_TIME   SIZE
t21             2024-02-05 16:14:32  2024-02-05 16:23:53  14319911        869025248       561             854705337
├──             test_db.idx_test                          INSERT          10000000
t33             2024-02-20 16:02:41  2024-02-20 16:08:21  913362031       1425529317      340             512167286
├──             aptest.sys_user                           INSERT          1000000
t32             2024-02-20 16:01:37  2024-02-20 16:02:06  881773547       913361946       29              31588399
├──             aptest.sys_dept                           INSERT          100000
t31             2024-02-20 16:00:14  2024-02-20 16:00:15  871100835       881773462       1               10672627
├──             aptest.tap_dept_tax                       INSERT          1000
t20             2024-02-04 14:29:43  2024-02-04 14:29:43  7163617         14319264        0               7155647
├──             test_db.t1                                INSERT          262144

性能

實測分析一個2G的Binlog,大概分析時間是2分半,也不慢

$ time python binlog_summary.py -f ./greatsql-bin.000001.txt --new -c transaction --sort size --extend --limit 5
......結果不展示
154.86s user 2.26s system 99% cpu 2:37.47 total

參考閱讀


Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:在dns3上安裝AD域服務 配置dns3IP 首選dns伺服器填dns1的IP 備用dns伺服器填dns2的IP 因為在我們的設置里,dns1損壞了,dns2代替它工作,所以dns2是備用伺服器 勾選AD域服務 一直點下一步直到安裝 二:將dns3升為子域的域控制器 點擊感嘆號選擇提升 選擇添加 ...
  • 實驗介紹: 額外的域控制器,不僅他們共同管理域,分擔了負荷。 在一臺域控制器故障的時候,另一臺還能代替它繼續工作。 一:dns2安裝ad域服務 配置dns2的ip 首選dns伺服器填dns1的IP 使其能互相ping通 添加ad域服務,一直點到安裝 二:將dns2變成第二台域伺服器 如圖點擊 和安裝 ...
  • 實驗介紹: 當電腦聯入網路時,域控制器首先要鑒別這臺電腦是否是屬於這個域的,用戶使用的登錄賬號是否存在、密碼是否正確。如果以上信息有一樣不正確,那麼域控制器就會拒絕這個用戶從這臺電腦登錄,相當於一個單位的門衛一樣。 一:dns1上安裝AD域服務 打開一臺windows虛擬機,改名為dns1 添加ad ...
  • Arduino IDE 環境配置 目錄Arduino IDE 環境配置1. 安裝方式2. 操作方法(Arduino中文社區)2.1. 安裝Arduino IDE2.2. 下載固件2.3. 修改Arduino IDE語言2.4. 添加開發板管理網址2.5. 運行離線包2.6. 檢查安裝是否成功 1. ...
  • 前提 centos7系統 新建系統時選擇的預設分區 vgs等查看捲組命令無回顯 根目錄磁碟空間不足 大致流程及註意事項 處理方法:刪除再重建 不會導致其中的數據丟失 防止出現意外,請備份或者快照 1.率先在VMware中對虛擬機進行磁碟容量擴容 此處進行20g --> 40g的擴容 2.再在虛擬機中 ...
  • 問題描述 在使用VMWare17.5.0版本安裝ubuntu22.0.4.4的時候遇到問題。安裝完成ubuntu之後,我在虛擬機中點擊滑鼠左鍵沒有問題,單獨按下鍵盤也沒有問題,但是如果按下鍵盤的同時在按下滑鼠左鍵就會卡住。而且100%穩定復現。 具體的卡死按鍵: ctrl+滑鼠左鍵 alt+滑鼠左鍵 ...
  • Ubuntu Server 20.04詳細安裝教程 1. Ubuntu Server20.04啟動盤製作 1.1 下載鏡像 去Ubuntu官網找到20.04的鏡像文件(20.04下載地址),按照自己的需求下載 iso文件 1.2 製作啟動盤 用Rufus製作啟動盤,到官網下載文件(rufus官網) ...
  • 蘇州農商銀行基於GaussDB資料庫,對核心業務系統“超級網銀”進行了全面改造升級,極大提升了系統的穩定性和安全性。 ...
一周排行
    -Advertisement-
    Play Games
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...