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

MySQL 實戰 Shell 腳本集錦:Memcached 管理、Binlog 清理、主從修復

     編輯:MySQL 資料庫相關知識

前言

生產環境中,MySQL 的日常運維離不開自動化腳本。本文分享三個實用的 Linux Shell 腳本:Memcached 服務管理腳本、MySQL Binlog 自動清理腳本、MySQL 主從同步自動修復腳本,幫助 DBA 提升運維效率。

一、Memcached 服務管理腳本

適用於 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

二、MySQL Binlog 自動清理腳本

運行於 Master 端,每天凌晨 5:30 執行,刪除 Slave 已同步完成的 Binlog,釋放磁碟空間。支援一主一從架構,透過建立測試資料庫驗證同步狀態,確保僅清理真正已同步的舊日誌。

核心邏輯

  • 檢查 MySQL 服務狀態
  • 驗證 Slave 連通性與合法性(比對 Master_Host)
  • 確認 Slave_IO_Running 與 Slave_SQL_Running 均為 Yes
  • 建立/刪除測試庫 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

三、MySQL 主從同步自動修復腳本

當檢測到 Slave 同步中斷時,自動嘗試修復:清理 Relay Log、重新指定同步位置、遇到重複鍵錯誤自動跳過(SQL_SLAVE_SKIP_COUNTER=1),直到同步追上或達到重試上限。

關鍵步驟

  1. 讀取 master.info 獲取原始主庫連接資訊
  2. 刪除所有 *-relay-bin.* 檔案
  3. CHANGE MASTER TO ... MASTER_LOG_POS=0 從頭開始同步
  4. 循環檢查狀態:若報錯則記錄錯誤並 SKIP COUNTER=1 跳過;若 Seconds_Behind_Master=0 且雙線程均為 Yes 則判定修復成功

注意事項

  • 自動跳過錯誤可能導致資料不一致,建議修復後進行資料校驗
  • 適用於非 GTID 模式的傳統複制架構
  • 生產環境建議加入告警通知機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved