Become a sponsor

定期备份是防止数据丢失的最后防线。本文介绍 MySQL 数据库备份、Redis 数据备份、上传文件备份的方案,以及自动化备份调度和恢复操作。
备份策略 3-2-1 原则
# 使用 mysqldump 备份单个数据库
mysqldump -h 127.0.0.1 -u root -p --single-transaction \
--routines --triggers --events \
djangoadmin.django.elevue > backup_$(date +%Y%m%d_%H%M%S).sql
# 压缩备份
mysqldump -h 127.0.0.1 -u root -p --single-transaction \
djangoadmin.django.elevue | gzip > backup_$(date +%Y%m%d_%H%M%S).sql.gz--single-transaction 作用
--single-transaction 参数确保 InnoDB 表的备份一致性,不锁表,不影响线上服务。
基于 MySQL binlog 实现增量备份:
# 查看当前 binlog 位置
mysql -u root -p -e "SHOW MASTER STATUS;"
# 备份 binlog
mysqlbinlog --start-datetime="2026-09-05 00:00:00" \
mysql-bin.000001 > binlog_incremental.sqlbinlog 配置
确保 MySQL 配置中启用了 binlog:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7# 手动触发 RDB 快照
redis-cli BGSAVE
# 查看最后一次快照时间
redis-cli LASTSAVE
# 复制 RDB 文件
cp /var/lib/redis/dump.rdb /data/backup/redis_$(date +%Y%m%d).rdbRedis 备份建议
Redis 用于缓存和 JWT token 黑名单,数据可从数据库重建。建议使用 RDB 快照即可。
# 打包上传目录
tar -czf uploads_$(date +%Y%m%d).tar.gz /data/apps/DjangoAdmin_Django_EleVue/public/uploads/
# 使用 rsync 增量同步到远程
rsync -avz --delete /data/apps/DjangoAdmin_Django_EleVue/public/uploads/ backup@10.0.2.100:/data/backup/uploads/创建 /data/scripts/backup.sh:
#!/bin/bash
# 备份目录
BACKUP_DIR="/data/backup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# 创建备份目录
mkdir -p ${BACKUP_DIR}/{mysql,redis,uploads}
# MySQL 备份
mysqldump -h 127.0.0.1 -u djangoadmin -p'<密码>' \
--single-transaction djangoadmin.django.elevue | gzip > \
${BACKUP_DIR}/mysql/backup_${DATE}.sql.gz
# Redis 备份
redis-cli BGSAVE
sleep 5
cp /var/lib/redis/dump.rdb ${BACKUP_DIR}/redis/redis_${DATE}.rdb
# 上传文件备份
tar -czf ${BACKUP_DIR}/uploads/uploads_${DATE}.tar.gz \
/data/apps/DjangoAdmin_Django_EleVue/public/uploads/
# 清理过期备份
find ${BACKUP_DIR} -type f -mtime +${RETENTION_DAYS} -delete
echo "[$(date)] Backup completed" >> /var/log/backup.log# 编辑定时任务
crontab -e
# 每天凌晨 2 点执行备份
0 2 * * * /bin/bash /data/scripts/backup.sh >> /var/log/backup.log 2>&1# 从 SQL 文件恢复
mysql -h 127.0.0.1 -u root -p djangoadmin.django.elevue < backup_20260905.sql
# 从压缩文件恢复
gunzip < backup_20260905.sql.gz | mysql -h 127.0.0.1 -u root -p djangoadmin.django.elevue# 停止 Redis
redis-cli SHUTDOWN NOSAVE
# 替换 RDB 文件
cp /data/backup/redis/redis_20260905.rdb /var/lib/redis/dump.rdb
# 启动 Redis
redis-server /etc/redis/redis.conf重要
定期进行恢复演练,验证备份文件的完整性和可用性。建议每季度至少演练一次。
备份方案覆盖 MySQL(mysqldump 全量 + binlog 增量)、Redis(RDB 快照)、上传文件(tar 打包 + rsync 同步)。通过 Crontab 实现自动化调度,保留最近 7 天备份。关键要点:备份文件异地存储、定期恢复演练验证完整性、监控备份任务执行状态。