文章目录
- 前言
- 一、分析 binlog 内容
- 二、编写脚本
- 结果
- 总结
前言
高效快捷分析 mysql binlog 日志文件。
mysql binlog 文件很大
怎么快速通过关键字查找内容
一、分析 binlog 内容
通过 mysqlbinlog
命令可以看到 binlog 解析之后的大概样子
二、编写脚本
编写脚本 search_txt.sh,作用是搜索 binlog 内容
使用 awk
#!/bin/bash
# 设置变量
if [ "$1" = "" ]; then
echo "param can not null "
exit 1
fi
BINLOG_FILE="/pddyjc/mysql/logbin/log_bin.$1" # 替换为你的 binlog 文件路径
SEARCH_STRING="pddyjc_pb_year_sxbph_report_info" # 替换为你要搜索的字符串
OUTPUT_FILE="search_pddyjc_pb_year_sxbph_report_info_$1.txt" # 替换为你想要保存输出结果的文件路径
if [ -e "$BINLOG_FILE" ]; then
echo "$BINLOG_FILE"
else
echo "$BINLOG_FILE file not exists"
exit 1
fi
# 使用 awk 筛选 binlog 中包含特定字符串的完整事件
/pddyjc/mysql/bin/mysqlbinlog "$BINLOG_FILE" | awk -v search_string="$SEARCH_STRING" '
BEGIN {
capturing = 0;
prev_date_str = ""; # 附加, 记录上一次时间行
}
# /[#]/ { next; } # 跳过注释行
/$/ { # 空行表示新事件的开始
if (capturing) {
capturing = 0; # 结束当前事件的捕获
}
}
{
# 自定义判断条件
if ($0 ~ search_string && $0 !~ "insert") {
capturing = 1; # 开始捕获事件
if (prev_date_str != "") {
print prev_date_str; # 这里输出有时间那行,以方便判断执行时间
}
}
if (capturing) {
print; # 如果正在捕获事件,则输出当前行
}
# 更新 prev_date_str
if ($0 ~ "end_log_pos") {
prev_date_str = $0 # 把时间行缓存
}
}
' > "$OUTPUT_FILE"
# 输出结果提示
echo "筛选完成,结果已保存到 $OUTPUT_FILE"
执行方式, 1234 是binlog 文件名序号(根据实际情况替换)
sh search_txt.sh 1234
结果
查看输出文件内容,得到的结果内容如下
总结
熟悉掌握 awk
,快速通过指定关键字、表名等查找二进制日志内容。
—————— 但行好事莫问前程,你若盛开蝴蝶自来