磁碟損壞或人為誤刪導致實體 binlog 文件遺失,造成 SHOW BINARY LOGS 記錄與實際文件不一致,影響主從同步與時間點恢復(PITR)。
SHOW BINARY LOGS 記錄的文件編號diff 比對兩份清單,找出差異#!/bin/sh
# binlogdiff.sh
# 作者: ocpyang@126.com
# 用途: 比對 MySQL 記錄的 binlog 與實體文件,檢測遺失
# 載入環境變數(含 MYSQL_HOST/USER/PASS)
source /usr/local/mysql/scripts/mysql_env.ini
# 暫存文件(含時間戳避免衝突)
binlog_init=tmpinit.$(date +%Y%m%d%H%M%S).txt
binlog_midd=tmpmidd.$(date +%Y%m%d%H%M%S).txt # MySQL 記錄
binlog_res=tmpres.$(date +%Y%m%d%H%M%S).txt # 實體文件
# 從 my.cnf 解析 binlog 路徑
my_cnf=/usr/local/mysql/my.cnf
log_bin_path=$(grep -i "^log-bin" $my_cnf | cut -d= -f2)
log_bin=$(dirname $log_bin_path)
# 1. 取得 MySQL 記錄的 binlog 編號
mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASS} -e "SHOW BINARY LOGS;" > ${binlog_init}
cat ${binlog_init} | cut -f1 | cut -d. -f2 | grep -i '^[0-9]' | sort -n > ${binlog_midd}
# 2. 掃描實體目錄的 binlog 編號
ls -t ${log_bin} | grep '^mysql-bin' | cut -d. -f2 | grep -i '^[0-9]' | sort -n > ${binlog_res}
# 3. 比對差異
diff -c ${binlog_midd} ${binlog_res}
# 清理暫存
rm -f ${binlog_init} ${binlog_midd} ${binlog_res}
| 指令 | 說明 |
|---|---|
cut -f1 | 取第一欄(文件名) |
cut -d. -f2 | 以點分割取第二段(編號部分) |
grep '^[0-9]' | 過濾純數字開頭的行 |
sort -n | 數值排序 |
ls -t | 按修改時間排序(最新在前) |
diff -c | 上下文格式顯示差異 |
expire_logs_days 參數管理保留期限