本文约 3,719 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:面板自带备份,为什么还要自己配
宝塔的”计划任务”确实能一键备份网站和数据库,但默认行为有两个问题:
- 备份存在本机磁盘,服务器故障就一起没;
- 没有失败告警,备份失败了你可能几个月都不知道。
补齐这两点,备份才算完整。本文按”可用”标准配置。
原理分析:宝塔计划任务的三种类型
| 类型 | 做什么 | 适用 |
|---|---|---|
| 备份网站 | 打包站点目录(不含数据库) | 文件备份 |
| 备份数据库 | mysqldump 导出 | 数据库备份 |
| Shell 脚本 | 执行自定义命令 | 异地同步、清理、校验 |
| 日志切割 / 释放内存 | 系统维护 | 辅助 |
备份目录默认在 /www/backup/,分为 site/ 与 database/。
保姆级实操
第一步:创建数据库备份任务
计划任务 → 添加任务:
- 任务类型:备份数据库;
- 执行周期:每天 03:00;
- 数据库:选择站点对应的数据库;
- 保留份数:7。
第二步:创建网站文件备份任务
- 任务类型:备份网站;
- 执行周期:每周日 04:00;
- 网站:选择站点;
- 保留份数:4。
第三步:排除缓存目录(重要)
宝塔的网站备份默认打包整个站点目录,包括缓存。编辑任务 → 排除规则(部分版本支持),或者改用 Shell 脚本自己打包:
#!/usr/bin/env bash
# /root/wp-file-backup.sh
DOMAIN="mimangfei.com"
SRC="/www/wwwroot/${DOMAIN}"
BK="/www/backup/custom"
DATE=$(date +%F)
mkdir -p "$BK"
cd "$SRC" || exit 1
tar czf "${BK}/${DOMAIN}-files-${DATE}.tar.gz" \
--exclude='wp-content/cache' \
--exclude='wp-content/wflogs' \
--exclude='*.log' \
--exclude='wp-content/updraft' \
wp-content wp-config.php .htaccess
# 保留 28 天
find "$BK" -name "${DOMAIN}-files-*.tar.gz" -mtime +28 -delete
计划任务 → 任务类型选”Shell 脚本”,脚本内容填 bash /root/wp-file-backup.sh。
第四步:配置阿里云 OSS 同步
方案 A:用面板的”阿里云 OSS”插件(软件商店安装),在计划任务里选”备份到阿里云OSS”。
方案 B:用 ossutil 命令行(更可控):
# 安装
wget http://gosspublic.alicdn.com/ossutil/1.7.17/ossutil64
chmod +x ossutil64 && mv ossutil64 /usr/local/bin/ossutil
# 配置(AccessKey 交互输入,不要写进脚本)
ossutil config
# 按提示填 endpoint、accessKeyID、accessKeySecret
# 同步脚本
ossutil cp -r /www/backup/database oss://my-wp-backup/database --update
ossutil cp -r /www/backup/custom oss://my-wp-backup/files --update
第五步:配置腾讯云 COS 同步
# 安装 coscli
wget https://github.com/tencentyun/coscli/releases/download/v0.13.0/coscli-linux
chmod +x coscli-linux && mv coscli-linux /usr/local/bin/coscli
coscli config init # 交互填写 SecretId、SecretKey、Region
coscli sync /www/backup/database cos://backup-1258xxxx/database --delete
第六步:创建异地同步的 Shell 任务
#!/usr/bin/env bash
# /root/sync-to-oss.sh
LOG=/var/log/wp-backup-sync.log
echo "$(date) 开始同步" >> "$LOG"
ossutil cp -r /www/backup/database oss://my-wp-backup/database --update >> "$LOG" 2>&1
RC=$?
if [ $RC -ne 0 ]; then
echo "$(date) 同步失败" >> "$LOG"
curl -s "https://你的告警webhook" -d "text=WordPress备份同步失败"
fi
执行周期:每天 05:00(比备份任务晚 2 小时,确保备份已完成)。
第七步:密钥安全
不要把 AccessKey 写进脚本明文(脚本可能被备份、被同步出去)。正确做法:
- 用
ossutil config交互配置,密钥存在~/.ossutilconfig; - 或存到单独文件并设权限:
cat > /root/.oss-credentials <<'EOF'
OSS_KEY=xxx
OSS_SECRET=xxx
EOF
chmod 600 /root/.oss-credentials
脚本里 source /root/.oss-credentials。
另外,OSS/COS 的 Bucket 必须设为私有读写,备份里含数据库密码和用户数据。
第八步:开启失败告警
宝塔计划任务支持”任务执行结果通知”,可绑定面板消息、邮件或企业微信/钉钉机器人。
没有机器人也可以用简单的 curl 告警(见第六步脚本)。
第九步:验证备份可用
# 1. 确认本地备份存在且非空
ls -lh /www/backup/database/ | tail -5
# 2. 确认 OSS 上有对应文件
ossutil ls oss://my-wp-backup/database/ | tail -5
# 3. 恢复演练(导入到测试库)
mysql -e "CREATE DATABASE wp_restore_test;"
gunzip < /www/backup/database/wordpress_2026-10-10.sql.gz | mysql wp_restore_test
mysql -e "SELECT COUNT(*) FROM wp_restore_test.wp_posts;"
mysql -e "DROP DATABASE wp_restore_test;"
常见踩坑与失败案例
- 备份目录在同盘 —— 面板默认存
/www/backup/,与站点同盘。磁盘故障一起丢,所以异地同步是必需项。 - 案例:某站配置了 OSS 同步,但 AccessKey 过期后同步一直失败,半年无人发现。站点出事时 OSS 上最新备份是八个月前的。告警比同步本身更重要。
- 备份文件体积暴涨 —— 没排除缓存目录,一个缓存插件能产生几个 GB 的无用数据。
ossutil权限问题 —— 用 root 执行计划任务时配置文件在/root/.ossutilconfig,用其他用户执行会找不到。计划任务默认以 root 运行,保持一致即可。- 数据库备份为 0 字节 —— 面板的数据库用户权限不足,或磁盘已满。定期检查文件大小。
- COS/OSS 流量费用 —— 每日全量上传会产生流量费,可用
--update(只传变化文件)或生命周期规则控制成本。
总结
宝塔计划任务能做出完整的备份闭环,但要做对四件事:分频率(数据库每日、文件每周)、排除缓存、异地同步、失败告警。其中最容易被忽略的是告警——静默失败的备份等于没有备份。配置完成后,按第九步做一次恢复演练,确认 /www/backup/ 里的 SQL 真的能导入。把这套配置写进你的运维文档,换服务器时照着做一遍即可。
