
上周一个朋友打电话来,声音都是抖的:“服务器被人删了,数据还能找回吗?”
我问:“有备份吗?”
沉默了三秒。“没有。”
那一刻,我不知道该说什么。他不是不懂技术,他就是懒。觉得“应该没事”,觉得“明天再配”。结果明天没来,灾难先来了。
数据丢了,什么都没了。用户数据、订单记录、几年的文章。想哭都哭不出来。
今天不跟你讲大道理,直接给一份备份脚本。复制粘贴,改几个路径,就能每天自动备份你的数据库和网站文件。花半小时配置,换往后无数个安稳觉。
先看一个数据
某云厂商统计过,60%的中小企业没有自动化备份。其中一半的人认为“手动备份就够了”,另一半“根本没想过备份”。
手动备份的问题在哪?你会忘。今天忙,明天忘,后天想起来,已经来不及了。自动化备份就是解决“忘记”这个问题的。
备份什么?三样东西
- 数据库:MySQL 或 MariaDB,你的文章、订单、用户都在里面
- 网站文件:
/var/www或者你的站点目录 - 配置文件(可选):Nginx、Apache、PHP 配置,方便恢复环境
今天先教前两个,第三个可以自己加。
一份全自动备份脚本
把下面的脚本保存为 /root/backup.sh。
bash
#!/bin/bash # ===== 配置区 ===== DB_NAME="your_database" # 数据库名 DB_USER="root" # 数据库用户名 DB_PASS="your_password" # 数据库密码 WEB_DIR="/var/www/html" # 网站文件目录 BACKUP_DIR="/root/backups" # 备份存放目录 RETENTION_DAYS=7 # 保留最近7天的备份 # ================= # 创建备份目录(如果不存在) mkdir -p $BACKUP_DIR # 日期标签 DATE=$(date +%Y%m%d_%H%M%S) # 1. 备份数据库 mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_$DATE.sql # 2. 备份网站文件 tar -czf $BACKUP_DIR/files_$DATE.tar.gz -C $WEB_DIR . # 3. 可选:打包到一起(方便恢复) tar -czf $BACKUP_DIR/full_$DATE.tar.gz \ -C $BACKUP_DIR db_$DATE.sql \ -C $BACKUP_DIR files_$DATE.tar.gz # 4. 删除7天前的旧备份 find $BACKUP_DIR -name "*.sql" -mtime +$RETENTION_DAYS -delete find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete echo "备份完成: $DATE"
怎么用:
- 把
your_database、root、your_password换成你自己的 - 把
/var/www/html换成你的网站目录 - 给脚本执行权限:
chmod +x /root/backup.sh - 手动跑一次测试:
/root/backup.sh
设置自动执行——用 crontab
手动跑没问题后,设置每天凌晨3点自动备份:
bash
crontab -e
添加这一行:
text
0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
解释:每天凌晨3点执行脚本,输出日志到 /var/log/backup.log。
检查是否生效:
bash
crontab -l
看到你加的那行,就行。
备份存哪里?本地+异地
脚本把备份存在本地 /root/backups。但如果服务器硬盘坏了,本地备份也没了。所以需要异地备份。
方案一:上传到云存储(推荐)
用 rclone 可以上传到多种云存储。
安装 rclone:
bash
apt install rclone
配置(以 Backblaze B2 为例):
bash
rclone config
然后修改备份脚本,在最后加上:
bash
rclone copy $BACKUP_DIR remote:my-bucket/backups/
方案二:同步到另一台服务器
用 rsync 同步到另一台有公网IP的服务器。
bash
rsync -avz $BACKUP_DIR user@另一台IP:/backup/
方案三:手动下载
每个月登录服务器,把备份文件下载到本地硬盘。虽然麻烦,但比没有强。
反常识点:很多人把备份存在同一台服务器的另一个盘。这不是异地备份。硬盘坏了,两个盘一起坏。异地必须物理隔离。
恢复教程——出事怎么救
备份不是为了好看,是为了恢复。所以必须提前演练。
恢复数据库
bash
mysql -u root -p your_database < /path/to/db_20260408.sql
恢复网站文件
bash
# 解压 tar -xzf /path/to/files_20260408.tar.gz -C /tmp/restore # 覆盖到网站目录 cp -r /tmp/restore/* /var/www/html/ # 恢复权限 chown -R www-data:www-data /var/www/html
恢复完整备份(数据库+文件)
bash
# 解压完整备份 tar -xzf /path/to/full_20260408.tar.gz -C /tmp/full_restore # 恢复数据库 mysql -u root -p your_database < /tmp/full_restore/db_20260408.sql # 恢复文件 tar -xzf /tmp/full_restore/files_20260408.tar.gz -C /var/www/html/
重要:恢复之前,先备份当前状态(万一恢复错了还能回去)。恢复之后,登录网站检查是否正常。
一个真实案例
一个做电商的朋友,用了我的脚本,每天自动备份到 Backblaze B2。
去年服务器被勒索病毒加密,所有文件打不开。他淡定地重装系统,从 B2 拉回昨天的备份,半小时恢复上线。损失只有昨天的订单数据(因为备份是凌晨的,当天的订单没了)。如果没备份,公司可能直接关门。
他后来请我吃饭,说:“你那脚本值一顿饭。”
我说:“你愿意花半小时配置,就值。”
最后一句:备份不是技术问题,是习惯问题
备份脚本很简单,复制粘贴就行。自动执行也很简单,一行 crontab。难的不是技术,是“现在就做”的习惯。
很多人想着“下周配”,下周复下周,直到出事。然后后悔。
今天花半小时,把脚本配好。以后每天凌晨,服务器自己就把备份做好了。你只需要偶尔看一眼日志,确认它还在跑。




