网站备份与恢复实战:数据库+文件,一份脚本全搞定

网站备份与恢复实战:数据库+文件,一份脚本全搞定

上周一个朋友打电话来,声音都是抖的:“服务器被人删了,数据还能找回吗?”

我问:“有备份吗?”

沉默了三秒。“没有。”

那一刻,我不知道该说什么。他不是不懂技术,他就是懒。觉得“应该没事”,觉得“明天再配”。结果明天没来,灾难先来了。

数据丢了,什么都没了。用户数据、订单记录、几年的文章。想哭都哭不出来。

今天不跟你讲大道理,直接给一份备份脚本。复制粘贴,改几个路径,就能每天自动备份你的数据库和网站文件。花半小时配置,换往后无数个安稳觉。


先看一个数据

某云厂商统计过,60%的中小企业没有自动化备份。其中一半的人认为“手动备份就够了”,另一半“根本没想过备份”。

手动备份的问题在哪?你会忘。今天忙,明天忘,后天想起来,已经来不及了。自动化备份就是解决“忘记”这个问题的。


备份什么?三样东西

  1. 数据库:MySQL 或 MariaDB,你的文章、订单、用户都在里面
  2. 网站文件/var/www 或者你的站点目录
  3. 配置文件(可选):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"

怎么用

  1. 把 your_databaserootyour_password 换成你自己的
  2. 把 /var/www/html 换成你的网站目录
  3. 给脚本执行权限:chmod +x /root/backup.sh
  4. 手动跑一次测试:/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。难的不是技术,是“现在就做”的习惯。

很多人想着“下周配”,下周复下周,直到出事。然后后悔。

今天花半小时,把脚本配好。以后每天凌晨,服务器自己就把备份做好了。你只需要偶尔看一眼日志,确认它还在跑。

知识库

数据库慢?先看索引!MySQL索引原理与实战

2026-4-7 15:12:38

知识库

一眼看懂网站访问情况:GoAccess日志分析实战

2026-4-9 15:31:03

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧