0
点赞
收藏
分享

微信扫一扫

summarize_binlogs - MySQL Binlog分析统计概述

半秋L 2024-10-10 阅读 2

summarize_binlogs - MySQL Binlog分析统计概述


命令帮助

# /root/summarize_binlogs.sh
Error: Binlog file is required.
Usage: /root/summarize_binlogs.sh -f <binlog_file> [-s <start_time>] [-e <end_time>]
  -f : MySQL binlog file (required)
  -s : Start time (optional, format: 'YYYY-MM-DD HH:MM:SS')
  -e : End time (optional, format: 'YYYY-MM-DD HH:MM:SS')


现在我们运行脚本来获取二进制日志中记录的信息摘要

# /root/summarize_binlogs.sh -f mysql-bin.000009 | more
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : UPDATE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 1 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : UPDATE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 1 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : DELETE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 0 | Delete(s) : 1] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : INSERT 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 1 | Update(s) : 0 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : UPDATE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 1 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : UPDATE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 1 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : DELETE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 0 | Delete(s) : 1] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : INSERT 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 1 | Update(s) : 0 | Delete(s) : 0] 
+----------------------+----------------------+----------------------+----------------------+
Timestamp : #240815 17:19:43 Table : `test`.`sbtest1` Query Type : UPDATE 1 row(s) affected
[Transaction total : 1 ==> Insert(s) : 0 | Update(s) : 1 | Delete(s) : 0] 
--More--

它会逐行对Binlog二进制日志进行分析。

使用示例

Q1: 按照事务大小进行排序,显示出前10名 - 查看是否存在大事务,大事务是导致主从延迟的真凶!

# /root/summarize_binlogs.sh -f mysql-bin.000009 | awk '
	/Timestamp :/ {
	  timestamp = substr($0, index($0, "#"), 17)  # Capture 17 characters for full timestamp
	  match($0, /Table : `[^`]+`.`[^`]+`/)
	  table = substr($0, RSTART, RLENGTH)
	}
	/\[Transaction total :/ {
	  gsub("`", "", table)
	  print timestamp, table, $0
	}
' | sort -rn -k9,9 | head -n 10
#240816 10:38:23  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:38:23  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:38:23  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:34:37  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:34:37  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:34:37  Table : test.sbtest1 [Transaction total : 2716 ==> Insert(s) : 2716 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:38:23  Table : test.sbtest1 [Transaction total : 1852 ==> Insert(s) : 1852 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:34:37  Table : test.sbtest1 [Transaction total : 1852 ==> Insert(s) : 1852 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:56:18  Table : test.sbtest1 [Transaction total : 1 ==> Insert(s) : 1 | Update(s) : 0 | Delete(s) : 0] 
#240816 10:56:18  Table : test.sbtest1 [Transaction total : 1 ==> Insert(s) : 1 | Update(s) : 0 | Delete(s) : 0] 


Q2:统计哪些表插入/更新/删除语句最多?

# /root/summarize_binlogs.sh -f mysql-bin.000009 | awk '
{
  # 提取包含表名的行
  if ($0 ~ /Table : `([^`]+)`\.`([^`]+)`/) {
    db = gensub(/.*Table : `([^`]+)`.*/, "\\1", "g", $0);
    tb = gensub(/.*Table : `[^`]+`\.`([^`]+)`.*/, "\\1", "g", $0);
  }
  
  # 匹配操作类型并记录操作数量
  if ($0 ~ /Query Type : INSERT/) {
    insert[db "." tb]++;
  } else if ($0 ~ /Query Type : UPDATE/) {
    update[db "." tb]++;
  } else if ($0 ~ /Query Type : DELETE/) {
    del[db "." tb]++;
  }
}

# 打印总结
END {
  # 打印标题行
  printf "%-25s %-10s %-10s %-10s %-10s\n", "Table", "INSERT", "UPDATE", "DELETE", "TOTAL";
  printf "---------------------------------------------------------------\n";
  
  # 用数组保存结果行
  for (db_tb in insert) {
    total = insert[db_tb] + update[db_tb] + del[db_tb];
    output[db_tb] = sprintf("%-25s %-10d %-10d %-10d %-10d", db_tb, insert[db_tb], update[db_tb], del[db_tb], total);
    total_count[db_tb] = total; # 用于排序
  }

  # 排序输出
  n = asorti(total_count, sorted, "@val_num_desc");
  for (i = 1; i <= n; i++) {
    db_tb = sorted[i];
    print output[db_tb];
  }
}
'

Table                     INSERT     UPDATE     DELETE     TOTAL     
---------------------------------------------------------------
test.sbtest1              37561      75106      37553      150220    
test.t1                   3          0          0          3   


举报

相关推荐

0 条评论