生產環境中,MySQL 的日常運維離不開自動化腳本。本文分享三個實用的 Linux Shell 腳本:Memcached 服務管理腳本、MySQL Binlog 自動清理腳本、MySQL 主從同步自動修復腳本,幫助 DBA 提升運維效率。
適用於 CentOS/RHEL 系統,支援 start、stop、restart、condrestart、reload、status 操作,並整合 chkconfig 實現開機自啟。
/etc/init.d/memcached#!/bin/bash
#=======================================================================================
# chkconfig: - 80 12
# description: Distributed memory caching daemon
# processname: memcached
#=======================================================================================
IPADDR=`/sbin/ifconfig eth1 | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'`
PORT="11211"
USER="root"
SIZE="2048"
CONNNUM="51200"
PIDFILE="/var/run/memcached.pid"
BINFILE="/usr/local/memcached/bin/memcached"
LOCKFILE="/var/lock/subsys/memcached"
RETVAL=0
start() {
echo -n $"Starting memcached......"
$BINFILE -d -l $IPADDR -p $PORT -u $USER -m $SIZE -c $CONNNUM -P $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
}
stop() {
echo -n $"Shutting down memcached......"
/sbin/killproc $BINFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
return $RETVAL
}
restart() {
stop
sleep 1
start
}
reload() {
echo -n $"Reloading memcached......"
/sbin/killproc $BINFILE -HUP
RETVAL=$?
echo
return $RETVAL
}
case "$1" in
start) start ;;
stop) stop ;;
restart) restart ;;
condrestart) [ -e $LOCKFILE ] && restart ; RETVAL=$? ;;
reload) reload ;;
status) status $prog ; RETVAL=$? ;;
*) echo "Usage: $0 {start|stop|restart|condrestart|status}" ; RETVAL=1 ;;
esac
exit $RETVAL
chmod +x /etc/init.d/memcached chkconfig --add memcached chkconfig --level 235 memcached on service memcached start
運行於 Master 端,每天凌晨 5:30 執行,刪除 Slave 已同步完成的 Binlog,釋放磁碟空間。支援一主一從架構,透過建立測試資料庫驗證同步狀態,確保僅清理真正已同步的舊日誌。
mytestdb 驗證同步延遲Master_Log_File、Relay_Master_Log_File、Master 當前 Binlog,判斷可安全清理的位置PURGE BINARY LOGS TO '...'vim /data/scripts/delete_mysql_binlog.sh # 腳本內容見原文,需修改 SLAVE_ADDR、SLAVE_USER、SLAVE_PWD 等參數 chmod +x /data/scripts/delete_mysql_binlog.sh # 加入 crontab crontab -e 30 05 * * * /data/scripts/delete_mysql_binlog.sh >/dev/null 2>&1
當檢測到 Slave 同步中斷時,自動嘗試修復:清理 Relay Log、重新指定同步位置、遇到重複鍵錯誤自動跳過(SQL_SLAVE_SKIP_COUNTER=1),直到同步追上或達到重試上限。
master.info 獲取原始主庫連接資訊*-relay-bin.* 檔案CHANGE MASTER TO ... MASTER_LOG_POS=0 從頭開始同步SKIP COUNTER=1 跳過;若 Seconds_Behind_Master=0 且雙線程均為 Yes 則判定修復成功