自动化备份最佳实践:再也不怕数据丢失
数据是企业的核心资产,一次意外就可能导致无法挽回的损失。建立完善的自动化备份体系是运维工作的重中之重。本文介绍一套经过生产验证的备份最佳实践。
一、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"
八、灾难恢复演练
至少每季度进行一次完整的灾难恢复演练:
- 准备一台全新的服务器
- 从云端下载最新备份
- 完整恢复所有数据
- 验证应用功能正常
- 记录恢复过程和时间
- 优化备份策略
总结
自动化备份是数据安全的最后一道防线。建立完善的备份体系需要考虑:全量备份与增量备份结合、本地存储与云存储结合、定期备份验证、灾难恢复演练。记住,没有经过验证的备份等于没有备份。
