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

MySQL 定時備份腳本實戰:mysqldump 自動化方案

     編輯:MySQL 資料庫相關知識

MySQL 定時備份腳本實戰:mysqldump 自動化方案

資料庫備份是運維核心職責。本文提供一個生產可用的 Shell 腳本,支援每日自動備份、保留最近 5 天、三種備份模式(mysqldump、mysqlhotcopy、tar 直接打包資料目錄),並具備日誌記錄與舊檔自動清理功能。

腳本核心特性

  • 單日最多執行一次,避免重複備份佔用資源
  • 自動保留最近 5 天備份,過期檔案自動刪除
  • 支援三種備份方式切換:mysqldump(邏輯備份)、mysqlhotcopy(實體熱備份)、tar(停庫冷備份)
  • 完整日誌記錄:時間戳、成功/失敗狀態、刪除舊檔記錄
  • 備份檔名含日期,格式:dbYYMMDD.tgz

完整腳本代碼

#!/bin/bash
# Auto MySQL Backup Script
# Powered by ASPbiz
# 2004-09

# ========== 設定區 ==========
DBName="MySQL"           # 資料庫名稱
DBUser="root"            # 登入帳號
DBPasswd=""              # 密碼(留空表示無密碼)
BackupPath="/root/"      # 備份儲存路徑
LogFile="/root/db.log"   # 日誌檔路徑
DBPath="/var/lib/MySQL/" # MySQL 資料目錄(tar 模式用)

# 備份方式:mysqldump | mysqlhotcopy | tar
# BackupMethod="mysqldump"
# BackupMethod="mysqlhotcopy"
BackupMethod="tar"
# ========== 設定結束 ==========

NewFile="${BackupPath}db$(date +%y%m%d).tgz"
DumpFile="${BackupPath}db$(date +%y%m%d)"
OldFile="${BackupPath}db$(date +%y%m%d --date='5 days ago').tgz"

echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile

# 刪除 5 天前的舊備份
if [ -f $OldFile ]; then
    rm -f $OldFile >> $LogFile 2>&1
    echo "[$OldFile] Delete Old File Success!" >> $LogFile
else
    echo "[$OldFile] No Old Backup File!" >> $LogFile
fi

# 若今日備份已存在則跳過
if [ -f $NewFile ]; then
    echo "[$NewFile] The Backup File exists, Can't Backup!" >> $LogFile
else
    case $BackupMethod in
        mysqldump)
            if [ -z $DBPasswd ]; then
                mysqldump -u $DBUser --opt $DBName > $DumpFile
            else
                mysqldump -u $DBUser -p$DBPasswd --opt $DBName > $DumpFile
            fi
            tar czvf $NewFile $DumpFile >> $LogFile 2>&1
            echo "[$NewFile] Backup Success!" >> $LogFile
            rm -rf $DumpFile
            ;;
        mysqlhotcopy)
            rm -rf $DumpFile
            mkdir $DumpFile
            if [ -z $DBPasswd ]; then
                mysqlhotcopy -u $DBUser $DBName $DumpFile >> $LogFile 2>&1
            else
                mysqlhotcopy -u $DBUser -p$DBPasswd $DBName $DumpFile >> $LogFile 2>&1
            fi
            tar czvf $NewFile $DumpFile >> $LogFile 2>&1
            echo "[$NewFile] Backup Success!" >> $LogFile
            rm -rf $DumpFile
            ;;
        tar)
            /etc/init.d/mysqld stop >/dev/null 2>&1
            tar czvf $NewFile $DBPath$DBName >> $LogFile 2>&1
            /etc/init.d/mysqld start >/dev/null 2>&1
            echo "[$NewFile] Backup Success!" >> $LogFile
            ;;
    esac
fi

echo "-------------------------------------------" >> $LogFile

部署與使用說明

  1. 將腳本存為 /usr/local/bin/dbbackup.sh 並賦予執行權限:chmod +x dbbackup.sh
  2. 根據環境修改設定區變數(資料庫名、帳號、密碼、路徑、備份方式)
  3. 加入 crontab 實現每日自動執行,例如每天凌晨 2:30:
    30 2 * * * /usr/local/bin/dbbackup.sh
  4. 定期檢查 /root/db.log 確認備份狀態

三種備份模式選擇建議

模式優點缺點適用場景
mysqldump跨版本相容、可單表恢復、壓縮率高大資料庫較慢、需鎖表(--single-transaction 可緩解)中小型資料庫、需邏輯備份、異機恢復
mysqlhotcopy速度快、不阻塞讀取、實體檔案級僅支援 MyISAM、需本機執行、Perl 相依大量 MyISAM 表、本機快速備份
tar最快、完整複製資料目錄必須停庫、不支援增量、跨版本風險維護窗口允許停機、極大資料庫、遷移場景

進階擴充建議

  • 加入 --single-transaction 參數(mysqldump 模式)實現 InnoDB 熱備份無鎖
  • 備份完成後同步至遠端儲存(rsync、S3、NAS)實現異地容災
  • 整合監控系統(Zabbix、Prometheus)對日誌關鍵字告警
  • 加入備份驗證步驟:定期在測試環境恢復驗證備份可用性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved