自动化备份最佳实践:再也不怕数据丢失


阿里云特惠 - 新用户专享

自动化备份最佳实践:再也不怕数据丢失

数据是企业的核心资产,一次意外就可能导致无法挽回的损失。建立完善的自动化备份体系是运维工作的重中之重。本文介绍一套经过生产验证的备份最佳实践。

一、3-2-1 备份原则

业界公认的黄金法则:

  • 3:至少保留 3 份备份(1 份主数据 + 2 份备份)
  • 2:使用 2 种不同的存储介质(本地磁盘 + 云存储)
  • 1:至少有 1 份异地备份(防止机房灾难)

二、MySQL 数据库备份

全量备份脚本

#!/bin/bash
# mysql_backup.sh - MySQL 全量备份脚本

BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 数据库列表
DATABASES="appdb logdb userdb"

# 执行备份
for DB in $DATABASES; do
    mysqldump -u backup_user -p'password' \
        --single-transaction \
        --quick \
        --lock-tables=false \
        $DB | gzip > $BACKUP_DIR/${DB}_${DATE}.sql.gz
    echo "Backup completed: ${DB}_${DATE}.sql.gz"
done

# 删除超过保留期的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# 上传到云存储(阿里云 OSS)
for file in $BACKUP_DIR/*_${DATE}.sql.gz; do
    ossutil cp $file oss://my-backup-bucket/mysql/
done

echo "MySQL backup completed at $(date)"

增量备份(使用 Percona XtraBackup)

#!/bin/bash
# mysql_incremental_backup.sh

XTRABACKUP="/usr/bin/xtrabackup"
BACKUP_BASE="/backup/mysql/incremental"
LOG_FILE="/var/log/mysql_backup.log"

# 检查是否存在完整备份
if [ ! -f "$BACKUP_BASE/base/xtrabackup_checkpoints" ]; then
    echo "Performing full backup..."
    $XTRABACKUP --backup --target-dir=$BACKUP_BASE/base \
        --user=backup_user --password=password
else
    echo "Performing incremental backup..."
    $XTRABACKUP --backup --target-dir=$BACKUP_BASE/inc_$(date +%Y%m%d%H%M) \
        --incremental-basedir=$BACKUP_BASE/base \
        --user=backup_user --password=password
fi

三、文件系统备份

#!/bin/bash
# file_backup.sh - 文件备份脚本

SOURCE_DIR="/var/www/html"
BACKUP_DIR="/backup/files"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 创建备份
tar -czf $BACKUP_DIR/www_${DATE}.tar.gz \
    --exclude='cache/*' \
    --exclude='log/*' \
    --exclude='tmp/*' \
    $SOURCE_DIR

# 上传到云存储
aws s3 cp $BACKUP_DIR/www_${DATE}.tar.gz s3://my-backup-bucket/files/

# 清理旧备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

四、定时任务配置

# 编辑 crontab
crontab -e

# 每天 2:00 执行 MySQL 全量备份
0 2 * * * /scripts/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

# 每小时执行增量备份
0 * * * * /scripts/mysql_incremental_backup.sh >> /var/log/mysql_backup.log 2>&1

# 每天 3:00 执行文件备份
0 3 * * * /scripts/file_backup.sh >> /var/log/file_backup.log 2>&1

# 每周日凌晨 4:00 执行完整备份
0 4 * * 0 /scripts/full_backup.sh >> /var/log/full_backup.log 2>&1

五、备份验证与恢复测试

备份只是第一步,验证备份是否可用更重要:

#!/bin/bash
# verify_backup.sh - 备份验证脚本

# 随机选择一个备份文件进行恢复测试
LATEST_BACKUP=$(ls -t /backup/mysql/*.sql.gz | head -1)

# 创建测试数据库
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS test_restore"

# 恢复备份
gunzip < $LATEST_BACKUP | mysql -u root -p test_restore

# 验证数据完整性
TABLE_COUNT=$(mysql -u root -p test_restore -e "SHOW TABLES;" | wc -l)

if [ $TABLE_COUNT -gt 0 ]; then
    echo "Backup verification PASSED"
else
    echo "Backup verification FAILED"
    # 发送告警
    echo "Backup verification failed!" | mail -s "备份验证失败" admin@example.com
fi

六、云存储备份方案

将备份上传到云端,确保异地存储安全:

# 阿里云 OSS
ossutil cp /backup/mysql/appdb_20260323.sql.gz oss://backup-bucket/mysql/

# 腾讯云 COS
coscli cp /backup/mysql/appdb_20260323.sql.gz cos://backup-bucket/mysql/

# AWS S3
aws s3 cp /backup/mysql/appdb_20260323.sql.gz s3://backup-bucket/mysql/

# 七牛云
qshell rput backup-bucket mysql/appdb_20260323.sql.gz /backup/mysql/appdb_20260323.sql.gz

七、备份监控与告警

#!/bin/bash
# backup_monitor.sh - 备份监控脚本

TODAY=$(date +%Y%m%d)
BACKUP_FILE="/backup/mysql/appdb_${TODAY}*.sql.gz"

if [ ! -f "$BACKUP_FILE" ]; then
    echo "今天没有备份文件!" | mail -s "备份缺失告警" admin@example.com
    exit 1
fi

# 检查文件大小
FILE_SIZE=$(stat -f%z "$BACKUP_FILE" 2>/dev/null || stat -c%s "$BACKUP_FILE")
if [ $FILE_SIZE -lt 1024 ]; then
    echo "备份文件异常小!" | mail -s "备份异常告警" admin@example.com
    exit 1
fi

echo "Backup check OK"

八、灾难恢复演练

至少每季度进行一次完整的灾难恢复演练:

  1. 准备一台全新的服务器
  2. 从云端下载最新备份
  3. 完整恢复所有数据
  4. 验证应用功能正常
  5. 记录恢复过程和时间
  6. 优化备份策略

总结

自动化备份是数据安全的最后一道防线。建立完善的备份体系需要考虑:全量备份与增量备份结合、本地存储与云存储结合、定期备份验证、灾难恢复演练。记住,没有经过验证的备份等于没有备份。

发表评论