首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 實戰腳本:檢查二進制日誌文件是否遺失(Shell + SQL 混合方案)

     編輯:MySQL 綜合教學

應用場景

磁碟損壞或人為誤刪導致實體 binlog 文件遺失,造成 SHOW BINARY LOGS 記錄與實際文件不一致,影響主從同步與時間點恢復(PITR)。

核心邏輯

  1. 從 MySQL 讀取 SHOW BINARY LOGS 記錄的文件編號
  2. 掃描實體 binlog 目錄下的實際文件編號
  3. 使用 diff 比對兩份清單,找出差異

完整 Shell 腳本

#!/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上下文格式顯示差異

輸出結果解讀

  • 無輸出:完全一致,無遺失
  • 顯示 `<` 行:MySQL 有記錄但實體文件不存在(遺失)
  • 顯示 `>` 行:實體文件存在但 MySQL 未記錄(孤兒文件)

部署建議

  • 加入 crontab 定期執行(如每小時)
  • 差異時發送告警郵件/簡訊
  • 配合 expire_logs_days 參數管理保留期限
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved