工具分享丨分析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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...