資料庫備份是運維核心職責。本文提供一個生產可用的 Shell 腳本,支援每日自動備份、保留最近 5 天、三種備份模式(mysqldump、mysqlhotcopy、tar 直接打包資料目錄),並具備日誌記錄與舊檔自動清理功能。
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
/usr/local/bin/dbbackup.sh 並賦予執行權限:chmod +x dbbackup.shcrontab 實現每日自動執行,例如每天凌晨 2:30:30 2 * * * /usr/local/bin/dbbackup.sh/root/db.log 確認備份狀態| 模式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| mysqldump | 跨版本相容、可單表恢復、壓縮率高 | 大資料庫較慢、需鎖表(--single-transaction 可緩解) | 中小型資料庫、需邏輯備份、異機恢復 |
| mysqlhotcopy | 速度快、不阻塞讀取、實體檔案級 | 僅支援 MyISAM、需本機執行、Perl 相依 | 大量 MyISAM 表、本機快速備份 |
| tar | 最快、完整複製資料目錄 | 必須停庫、不支援增量、跨版本風險 | 維護窗口允許停機、極大資料庫、遷移場景 |
--single-transaction 參數(mysqldump 模式)實現 InnoDB 熱備份無鎖