Shell 脚本自动化备份实战
Shell脚本是Linux自动化运维的基础工具。通过编写备份脚本并配合cron定时执行,可以实现服务器数据的自动化、规律性备份,为数据安全提供可靠保障。
一、备份脚本的基本结构
一个完整的备份脚本通常包含:环境变量配置、备份前检查、执行备份、压缩打包、上传到远端存储、清理过期备份、发送备份报告。
二、MySQL数据库备份脚本
#!/bin/bash
# MySQL自动备份脚本
# 作者:运维团队
# 日期:2025-01-01
set -euo pipefail # 严格模式:错误即退出
# ============ 配置 ============
DB_USER="backup_user"
DB_PASS="backup_password"
DB_HOST="127.0.0.1"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7 # 本地保留天数
COS_BUCKET="cos://my-backup-bucket/mysql" # 对象存储路径
LOG_FILE="/var/log/mysql_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname -s)
# ============ 日志函数 ============
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# ============ 备份前检查 ============
log "Starting MySQL backup..."
mkdir -p "$BACKUP_DIR"
# 检查磁盘空间(至少10G可用)
AVAILABLE=$(df -BG "$BACKUP_DIR" | awk 'NR==2{print $4}' | tr -d 'G')
if [ "$AVAILABLE" -lt 10 ]; then
log "ERROR: Insufficient disk space: ${AVAILABLE}G available"
exit 1
fi
# 检查MySQL连接
if ! mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -e "SELECT 1" > /dev/null 2>&1; then
log "ERROR: Cannot connect to MySQL"
exit 1
fi
# ============ 执行备份 ============
BACKUP_FILE="$BACKUP_DIR/mysql_${HOSTNAME}_${DATE}.sql.gz"
log "Dumping all databases to $BACKUP_FILE"
mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" --all-databases --single-transaction --flush-logs --routines --triggers | gzip > "$BACKUP_FILE"
FILE_SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
log "Backup completed: $BACKUP_FILE ($FILE_SIZE)"
# ============ 上传到对象存储 ============
log "Uploading to COS..."
coscmd upload "$BACKUP_FILE" "$COS_BUCKET/" && log "Upload successful" || log "WARNING: Upload failed"
# ============ 清理旧备份 ============
log "Cleaning backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_DIR" -name "mysql_*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
REMAINING=$(ls "$BACKUP_DIR"/mysql_*.sql.gz 2>/dev/null | wc -l)
log "Cleanup done. Remaining local backups: $REMAINING"
log "MySQL backup finished successfully"
三、文件目录增量备份脚本
#!/bin/bash # 使用rsync进行增量备份 SOURCE="/data/uploads" DEST="/backup/uploads" REMOTE="backup-server:/backup/uploads" # 本地增量备份(使用硬链接节省空间) rsync -avz --delete --link-dest="$DEST/latest" "$SOURCE/" "$DEST/$(date +%Y%m%d)/" ln -sfn "$DEST/$(date +%Y%m%d)" "$DEST/latest" # 同步到远端 rsync -avz --delete "$SOURCE/" "$REMOTE/"
四、备份验证脚本
#!/bin/bash
# 验证MySQL备份文件可恢复性
BACKUP_FILE=$1
TEST_DB="backup_verify_$(date +%s)"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
log "Verifying backup: $BACKUP_FILE"
# 创建测试数据库
mysql -e "CREATE DATABASE $TEST_DB CHARACTER SET utf8mb4;"
# 恢复备份到测试库
gunzip -c "$BACKUP_FILE" | mysql "$TEST_DB"
RESTORE_STATUS=$?
if [ $RESTORE_STATUS -eq 0 ]; then
TABLE_COUNT=$(mysql "$TEST_DB" -e "SHOW TABLES" | wc -l)
log "Verification PASSED: $TABLE_COUNT tables restored"
else
log "Verification FAILED: restore error"
fi
# 清理测试数据库
mysql -e "DROP DATABASE $TEST_DB;"
五、配置cron定时任务
crontab -e # 每天凌晨2点执行MySQL备份 0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1 # 每小时同步文件目录 0 * * * * /usr/local/bin/sync_uploads.sh >> /var/log/sync.log 2>&1 # 每周一验证上周备份 0 3 * * 1 /usr/local/bin/verify_backup.sh $(ls /backup/mysql/*.sql.gz | tail -1)
六、告警通知集成
send_alert() {
local msg="$1"
# 企业微信机器人
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" -H 'Content-Type: application/json' -d "{"msgtype":"text","text":{"content":"备份告警: $msg"}}"
}
# 在备份脚本中调用
if [ $BACKUP_STATUS -ne 0 ]; then
send_alert "MySQL备份失败!服务器: $(hostname), 时间: $(date)"
fi
七、总结
Shell脚本自动化备份是保障数据安全的重要手段。好的备份脚本应该具备:错误处理(set -e)、日志记录、备份验证、告警通知、自动清理等功能。脚本配置完成后,定期检查备份文件是否正常生成,并进行恢复演练,确保备份真正可用。