血的教训
数据丢了才想起备份——这个坑,做运维的都踩过。硬盘坏了、误删了、被勒索病毒加密了,回头一看没备份,那种绝望不想再经历第二次。
本文将分享一套实用的服务器自动备份方案,覆盖文件备份和数据库备份,配好之后不用再操心了。
备份的三个核心原则
1. 3-2-1 原则
- 至少 3 份数据副本
- 2 种不同介质
- 1 份异地备份
2. 自动化——手动备份一定会忘
3. 验证——不测试的备份等于没备份
方案一:crontab + tar 定时打包
最基础的方案,适合小站点。
备份脚本
#!/bin/bash
# /opt/scripts/backup.sh
DATE=\$(date +%Y%m%d)
BACKUP_DIR="/backup"
WEB_DIR="/var/www"
# 创建备份目录
mkdir -p \$BACKUP_DIR
# 备份网站文件
tar -czf \$BACKUP_DIR/web_\$DATE.tar.gz \$WEB_DIR
# 备份数据库(MySQL 示例)
mysqldump -u root -p'your_password' --all-databases | gzip > \$BACKUP_DIR/db_\$DATE.sql.gz
# 删除 7 天前的旧备份
find \$BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: \$DATE"加入定时任务
# 每天凌晨 2 点执行
crontab -e
0 2 * * * /bin/bash /opt/scripts/backup.sh >> /var/log/backup.log 2>&1方案二:rsync 增量备份
tar 每次都打包整个目录,文件多了又慢又占空间。rsync 只传变化的部分,效率高很多。
#!/bin/bash
# 增量同步到另一台服务器
rsync -avz --delete /var/www/ user@192.168.1.100:/backup/www/
# 同步数据库 dump
rsync -avz /backup/db_*.sql.gz user@192.168.1.100:/backup/db/方案三:数据库定时备份
MySQL
#!/bin/bash
# 按库分别备份,恢复时更灵活
USER="root"
PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=\$(date +%Y%m%d_%H%M)
mkdir -p \$BACKUP_DIR
# 获取所有数据库名
databases=\$(mysql -u\$USER -p\$PASS -e "SHOW DATABASES;" | grep -v "Database\|information_schema\|performance_schema")
for db in \$databases; do
mysqldump -u\$USER -p\$PASS --databases \$db | gzip > \$BACKUP_DIR/\$db-\$DATE.sql.gz
done
# 保留最近 14 天
find \$BACKUP_DIR -type f -mtime +14 -delete方案四:异地备份到云存储
本地备份防不了机房掉电、硬件损坏。把备份推到云端才算真安全。
用 rclone 同步到云
# 安装 rclone
curl https://rclone.org/install.sh | bash
# 配置(支持 OneDrive、Google Drive、阿里云 OSS 等)
rclone config
# 同步备份目录到云端
rclone sync /backup remote:server-backup --progress把这个命令加到 crontab,每天自动同步。
完整的一键脚本
整合以上思路,一个脚本搞定:
#!/bin/bash
# /opt/scripts/full-backup.sh
# 全自动备份:文件 + 数据库 + 推送到云端
DATE=\$(date +%Y%m%d_%H%M)
BACKUP_DIR="/backup"
LOG_FILE="/var/log/backup.log"
log() {
echo "[\$(date '+%Y-%m-%d %H:%M:%S')] \$1" | tee -a \$LOG_FILE
}
log "========== 开始备份 =========="
# 1. 备份文件
log "备份网站文件..."
tar -czf \$BACKUP_DIR/web_\$DATE.tar.gz /var/www
# 2. 备份数据库
log "备份数据库..."
mysqldump -u root -p'password' --all-databases | gzip > \$BACKUP_DIR/db_\$DATE.sql.gz
# 3. 清理旧备份(保留 7 天)
log "清理旧备份..."
find \$BACKUP_DIR -type f -mtime +7 -delete
# 4. 推送到云端(可选)
# rclone sync /backup remote:server-backup
log "========== 备份完成 =========="备份恢复验证
备份不是配了就完事了,定期验证才能睡得着觉。
# 每月抽一次恢复测试
mkdir /tmp/restore-test
tar -xzf /backup/web_20260718.tar.gz -C /tmp/restore-test/
# 检查文件完整性
ls -la /tmp/restore-test/
rm -rf /tmp/restore-test总结
数据丢了的痛,花半小时配备份就能避免。记住:
- 文件 + 数据库都要备份
- 本地 + 异地各一份
- 自动化,靠人不靠谱
- 定期验证恢复
人生苦短,别给丢数据留机会。
评论