生產級 MySQL 每日備份 Shell 腳本:壓縮、日誌、自動留存
腳本核心功能
- 遍歷匹配前綴的多個資料庫(
ls | grep idss)
mysqldump --opt 導出 → tar gzip 壓縮
- 檔名含時間戳:
dbname-YYYYMMDD-HHMM.sql.tgz
- 自動刪除 5 天前同前綴備份檔
- 完整日誌記錄:開始/結束時間、檔名、成功/失敗
- 失敗可選郵件告警(需 mailutils)
完整腳本
#!/bin/bash
USER=root
PASSWORD=cucrzmysql
BACKUP_DIR=/mysql_bak
LOGFILE=/mysql_bak/data_backup.log
for DATABASE in $(ls /mysql/data/mysql/ | grep idss); do
DATE=$(date '+%Y%m%d-%H%M')
DATE_5=$(date -d "-5 day" +%Y%m%d)
DUMPFILE=$DATABASE-$DATE.sql
ARCHIVE=$DATABASE-$DATE.sql.tgz
[ ! -d $BACKUP_DIR ] && mkdir -p "$BACKUP_DIR"
echo " " >> $LOGFILE
echo "----------------------" >> $LOGFILE
echo "BACKUP DATE: $(date +"%Y-%m-%d %H:%M:%S")" >> $LOGFILE
echo "----------------------" >> $LOGFILE
cd $BACKUP_DIR
rm -rf $DATABASE-$DATE_5* # 清理 5 天前舊檔
mysqldump --opt $DATABASE -u$USER -p$PASSWORD > $DUMPFILE
if [[ $? == 0 ]]; then
tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
echo "[$ARCHIVE] Backup Successful!" >> $LOGFILE
rm -f $DUMPFILE
else
echo "Database Backup Fail!" >> $LOGFILE
# mail -s "Database:$DATABASE Daily Backup Fail" $WEBMASTER
fi
echo "Backup Process Done"
done
部署建議
# crontab -e
0 2 * * * /path/backup.sh >/dev/null 2>&1 # 每日 02:00 執行
進階優化
- 改用
--single-transaction(InnoDB 一致性)
- 上傳至異地存儲(S3/OSS/NFS)
- 加入校驗和驗證(
md5sum)
- 監控備份檔大小突變告警