通過 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 證書bind-address + 防火牆痛點:手動 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" <
SHOW SLAVE STATUS,取最小 Master_Log_File 作為清理水位線expire_logs_days 自動清理# 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
Shell 腳本是運維自動化的起點,善用參數化、錯誤處理、審計日志,構建可信的自動化體系。