新手可用!3 步完成手动备份,5 分钟搞定自动化与异地备份,并还原网站。含踩坑提示与最佳实践清单。
声明
这篇是给“想稳住自己站点”的同学看的:步骤不难,但一定记住——WordPress 的备份分两块:程序文件 + 数据库,缺一不可。只备文件不备库,恢复时就会“空壳站”;只备库不备文件,主题/插件/上传资源就对不上。还要提醒一下:备份≠万无一失,建议定期把备份拿到本地/云上留底,最好按 3-2-1 原则来做(3 份副本、2 种介质、1 份异地),这样心里才更踏实。
为什么要备份 & 备份到底包含啥
风险来自硬件故障、误操作、黑客、插件/主题冲突、服务商问题等;定期备份是“最后一道保险”。
完整备份=程序文件 + 数据库:
程序文件:WP 核心、主题
wp-content/themes/、插件wp-content/plugins/、媒体wp-content/uploads/、配置/根目录文件等;数据库:文章、页面、评论、设置、用户等全部内容。
菜鸡也能翻车的典型:只备程序文件没备数据库,结果还原不了。
手动备份:程序文件 + 数据库
备份程序文件
面板 →「网站」→ 找到你的站点 → 点“备份”(有或者无备份) → 备份站点。备份完成后可直接“下载”。
备份文件(站点)在服务器默认目录一般为:
/www/backup/site/站点名/(走面板“备份”生成)。
备份数据库
面板 →「数据库」→ 找到 WP 对应的数据库(不确定看 wp-config.php 的 DB_NAME)→ 点“备份”(有或者无备份) → 备份数据库,随后即可“下载”。
备份文件(数据库)默认在:/www/backup/database/数据库名/,格式通常为 .sql 或 .sql.gz。
牢记:一次“完整备份”= 上面两个步骤都要做。
自动化备份:计划任务 & 保留策略
面板 →「计划任务」→ 添加任务:
任务类型选“备份网站”;设置周期(建议每日/每周)、保留份数(例如保留最近 7–14 份)。
再新建一个“备份数据库”的任务,与网站任务同频。
自动化能防止“忘记备份”的人祸,建议把任务时间放在低峰时段(如凌晨 2 点),避免影响业务。
异地备份:把备份同步到云端
“备份到”除了服务器磁盘,也可选第三方云(需在面板应用/插件里对接,如 OSS、COS、S3、Google Drive 等),用于异地备份。
推荐遵循 3-2-1 备份原则:3 份副本、2 类介质、1 份异地;并且定期做一次恢复演练验证备份可用。
如何从备份“原地满血复活”
恢复=恢复文件 + 恢复数据库,两步都要做!
恢复网站文件
找到站点备份档:
/www/backup/site/站点名/;将选定备份复制到站点根:
/www/wwwroot/站点名/;(可选)清理根目录中非备份文件,仅保留要恢复的备份;
解压备份归位,确认权限无误。
恢复数据库
面板 →「数据库」→ 目标库的“备份/恢复”→ 选中要恢复的 .sql 备份 → 确认还原。完成后建议清缓存并核验前端功能。
在群晖NAS里面定时下载备份
在群晖上准备 SSH 免密
登录群晖 SSH/终端:
# 进入家目录
cd ~
mkdir -p ~/.ssh # 如果不存在
# 设置用户主目录权限
chmod 755 /volume1/homes/<用户名>
# 设置 .ssh 目录权限
chmod 700 /volume1/homes/<用户名>/.ssh
# 设置 authorized_keys 文件权限
chmod 600 /volume1/homes/<用户名>/.ssh/authorized_keys
# 生成密钥(推荐 Ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
# 将公钥内容追加到阿里云服务器的 authorized_keys, 路径一般为(换行添加一条记录) :/root/.ssh/authorized_key
# 预先写入 known_hosts,避免计划任务首连时交互
ssh-keyscan -p 22 ALIYUN_IP >> ~/.ssh/known_hosts # 需要安装套件 SynoCli Network Tools
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/known_hosts
写一个 SSH 客户端配置,后面脚本更简洁
Host ecs
HostName 服务器ip
User 用户名
Port ssh的端口(默认22)
IdentityFile ~/.ssh/id_ed25519
保存后:chmod 600 ~/.ssh/config。
测试连通:ssh aliyun "ls -l /www/backup"(第一次连接应直接成功且无需输入密码)
准备备份脚本
你可以放在你常用的脚本路径,比如 /home/用户名/ecs_www_backup.sh,假设保存的路径为 /volume3/网站/backup,保持最近的3份,脚本命令为
#!/bin/bash
set -Eeuo pipefail
shopt -s nullglob
# —— 基本参数 ——
REMOTE="ecs" # 对应 ~/.ssh/config 里的 Host(或直接写 user@host)
REMOTE_PATH="/www/backup/" # 阿里云服务器上的备份目录
BASE="/volume3/网站/backup" # 群晖上的目标父目录(包含中文名,已全程加引号)
STAMP="$(date +%Y-%m-01)" # 每月 1 号的时间戳目录名
TARGET="${BASE}/${STAMP}"
LAST="${BASE}/_last" # 指向最近一次快照的软链接(用于增量/硬链接复用)
LOG="/home/用户名/ecs_www_backup.log"
MAX_SNAPSHOTS=3 # 最多保留最近 3 份
# —— 目录准备 ——
mkdir -p "$BASE" "$TARGET" "$(dirname "$LOG")"
# —— 增量同步(硬链接),首次没有 _last 就全量,同步时删除目标多余文件保持镜像 ——
LINK_OPTS=()
if [ -e "$LAST" ]; then
LINK_OPTS=(--link-dest="$LAST")
fi
rsync -av --delete --no-perms --no-owner --no-group --omit-dir-times \
-e "ssh -F $HOME/.ssh/config" \
"${LINK_OPTS[@]}" "${REMOTE}:${REMOTE_PATH}" "${TARGET}/" > "$LOG" 2>&1
# —— 更新最近一次快照的软链接 ——
rm -f "$LAST"
ln -s "$TARGET" "$LAST"
# —— 只保留最近 3 份快照:按目录的修改时间倒序,跳过最新 3 个,删掉其余 ——
snaps=( $(ls -1dt "$BASE"/20[0-9][0-9]-[01][0-9]-01 2>/dev/null || true) )
if (( ${#snaps[@]} > MAX_SNAPSHOTS )); then
to_delete=( "${snaps[@]:MAX_SNAPSHOTS}" )
for d in "${to_delete[@]}"; do
echo "Pruning old snapshot: $d" | tee -a "$LOG"
rm -rf -- "$d"
done
fi
echo "Backup finished at $(date)" | tee -a "$LOG"
脚本保存后,执行
chmod +x /home/用户名/ecs_www_backup.sh 权限准备
确保账号对共享文件夹“备份”(即 /volume3/网站/backup)有 读写 权限:
“控制面板 → 共享文件夹 → 选中 备份 → 编辑 → 权限 → 给 gang 授权 读/写”。
在群晖设置计划任务(每月1号自动执行)
在群晖 – 控制面板 – 任务计划 – 新增 – 计划的任务 – 用户定义的脚本 – 在常规一栏:任务名称:aliyun_www_backup(可自定) – 用户帐号:自己的账号或者root(要看自己的密钥是在哪一个账号里面,并且要保证该账号拥有读写权限) – 在计划一栏:日期 – 在以下天中运行 – 重复: 每月 第一个 周一 开始时间设为2:00 (可自定)- 在任务设置一栏 – 勾选通过电子邮件发送运行详情并设置邮箱(可自定) – 用户定义的脚本(目录自定义):
/bin/bash /home/用户名/ecs_www_backup.sh > /home/用户名/ecs_www_backup.log 2>&1 # >> 表示将输出追加到日志文件中, > 表示清除上一次的输出,即覆盖写入
保存后,先点一次“运行”做首测;再查看 /var/log/aliyun_www_backup.log 与目标目录是否正确落地。
常见坑位与排错清单
只备了文件没备库 → 无法完整还原(典型翻车场景)。
忘设自动化 → 人一忙就没备份,建议立刻配置计划任务,站点与数据库各一个。
备份只放服务器 → 一旦硬盘/主机翻车,备份也一起没了;务必上云或下载到本地,遵循 3-2-1。
恢复后异常 → 清缓存、检查
.htaccess / Nginx重写、确认wp-config.php数据库连接正确,再看插件/主题兼容。存储占满 → 设“保留份数”,定期清理老备份;大改前做一次手动备份再动手。
🌟 亲爱的少年哟,你已经通关啦!前方是星辰大海,休息一下再出发吧~
— 完 —
