首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Shell 腳本實現遠程 MySQL 自動化查詢與 Binlog 安全清理

     編輯:MySQL 資料庫相關知識

通過 Shell 腳本封裗 MySQL 客戶端,可實現定時巡檢、自動化運維、跨機器執行。本文提供兩個實戰模板:參數化查詢與主從 Binlog 安全清理。

模板一:參數化遠程查詢

#!/bin/bash
# config
HOST="192.168.5.40"
USER="abc"
PASS="123456"
DB="testdb"

# 執行查詢(Here Document 避免密碼進程列表洩露)
QUERY=$(mysql -h"$HOST" -u"$USER" -p"$PASS" <

安全加固:

  • 使用 --defaults-extra-file 指定密碼文件(權限 600),避免命令行洩露
  • 啟用 --skip-ssl 或配置 CA 證書
  • 限制來源 IP:bind-address + 防火牆

模板二:主從 Binlog 安全清理

痛點:手動 PURGE MASTER LOGS 風險高(誤刪導致從庫斷點)、文件巨大佔磁盤。

#!/bin/bash
HOST="192.168.5.30"
USER="abc"
PASS="123456"

# 1. 獲取主庫當前 Binlog 位點
MASTER_STATUS=$(mysql -h"$HOST" -u"$USER" -p"$PASS" -e "SHOW MASTER STATUS\G")
CURRENT_LOG=$(echo "$MASTER_STATUS" | awk '/File:/ {print $2}')

# 2. 獲取所有從庫最舊未執行位點(需從庫可連接)
# 簡化版:保留當前文件 + 前 1 個文件
LOG_INDEX=$(echo "$CURRENT_LOG" | sed 's/.*\.//')
PREV_INDEX=$((LOG_INDEX - 1))
PREV_LOG=$(printf "%s.%06d" "${CURRENT_LOG%.*}" "$PREV_INDEX")

# 3. 執行清理(保留前 2 個文件,極度保守)
mysql -h"$HOST" -u"$USER" -p"$PASS" <

生產級清理策略

  1. 從庫同步檢查:遍歷所有從庫 SHOW SLAVE STATUS,取最小 Master_Log_File 作為清理水位線
  2. 保留窗口:至少保留 24-48 小時 Binlog,配合 expire_logs_days 自動清理
  3. 備份先行:清理前確保全量備份可用
  4. 幂等腳本:重複執行無副作用,記錄審計日志

定時任務部署

# crontab -e
# 每天凌晨 2 點執行巡檢
0 2 * * * /opt/scripts/mysql_daily_check.sh >> /var/log/mysql_check.log 2>&1

# 每週日清理 Binlog
0 3 * * 0 /opt/scripts/mysql_purge_binlog.sh >> /var/log/mysql_purge.log 2>&1

進化方向:自動化運維平台

  • Ansible/Playbook 管理腳本分發與執行
  • Prometheus + Alertmanager 監控觸發自動清理
  • GitOps:腳本版本化、審計、回滾

Shell 腳本是運維自動化的起點,善用參數化、錯誤處理、審計日志,構建可信的自動化體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved