Shell 脚本自动化备份

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)、日志记录、备份验证、告警通知、自动清理等功能。脚本配置完成后,定期检查备份文件是否正常生成,并进行恢复演练,确保备份真正可用。