发布时间:2026-09-15 12:33 更新时间:2026-09-15 12:33 阅读量:0
网站跑起来之后,真正让人睡不着的往往不是流量,而是“数据只有一份”。服务器被误删、磁盘损坏、面板重装,任何一次意外都可能让几个月的文章和订单归零。宝塔面板自带的计划任务能把数据库和网站文件定时打包,再推到另一台机器或对象存储,属于投入很低、回报很高的基础运维动作。下面按“先本地备份跑通、再做异地存储、最后校验与演练”的顺序讲一遍。
一个典型站点要备份的东西分两块:一是数据库,二是网站目录里的程序、上传附件和配置文件。只备份数据库会丢图片,只备份文件会丢文章和用户数据,两者必须成对出现。执行顺序上建议先导出数据库,再打包整个站点目录,这样压缩包里的数据是最新快照;如果反过来,可能出现数据库已经更新、文件包还是旧版本的时间差。
宝塔的「计划任务」支持四种任务类型:Shell 脚本、备份网站、备份数据库、访问 URL。新手可以直接用「备份网站」和「备份数据库」两个内置类型,分别选站点、设置保留份数,再挂上 FTP 或对象存储,门槛最低。但内置类型的灵活度有限,比如备份时想排除缓存目录、想给文件名加时间戳、想在上传前做完整性校验,就需要改用 Shell 脚本自己写。
无论用哪种方式,有几个参数要先想清楚:备份频率(每天一次通常够用,更新频繁的站可以每 6 小时一次)、保留份数(本地留 3~7 份即可,异地可留更久)、备份时段(放在凌晨低峰,避免和业务抢 IO)。
下面这段脚本演示了“导出 SQL + 打包网站目录 + 清理过期文件”的完整流程。路径、站点名、数据库名请按实际环境替换,宝塔的 MySQL 密码可以在面板数据库页面查看,或使用 /www/server/panel/data/default.db 中的记录,具体以实际环境为准。
#!/bin/bash
set -e
===== 可按需修改的变量 =====
SITE_DIR="/www/wwwroot/www.example.com"
DB_NAME="exampledb"
DB_USER="exampleuser"
DB_PASS="你的数据库密码"
BACKUP_DIR="/www/backup/site_manual"
KEEP_DAYS=7
STAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p "${BACKUP_DIR}"
1. 导出数据库(--single-transaction 减少对业务的影响)
mysqldump -u"${DB_USER}" -p"${DB_PASS}" \
--single-transaction --quick --default-character-set=utf8mb4 \
"${DB_NAME}" | gzip > "${BACKUP_DIR}/db_${DB_NAME}_${STAMP}.sql.gz"
2. 打包网站文件,排除缓存与日志目录
tar -czf "${BACKUP_DIR}/site_${STAMP}.tar.gz" \
--exclude="${SITE_DIR}/runtime/cache" \
--exclude="${SITE_DIR}/wp-content/cache" \
-C "$(dirname ${SITE_DIR})" "$(basename ${SITE_DIR})"
3. 清理超过保留天数的本地备份
find "${BACKUP_DIR}" -type f -name "*.gz" -mtime +${KEEP_DAYS} -delete
echo "backup done: ${STAMP}"
几个容易踩的坑:mysqldump 的密码直接写在脚本里,要保证脚本权限是 600,只给 root 可读;如果数据库表使用的是 MyISAM 引擎,--single-transaction 不会生效,需要改用 --lock-tables,但会短暂锁表,建议先确认引擎类型。tar 打包时用 -C 切换父目录再写相对路径,可以避免压缩包里出现一长串绝对路径,恢复时更清爽。
脚本写好后放进 /www/backup/scripts/backup.sh,赋予执行权限,然后在宝塔「计划任务」里新建 Shell 脚本任务,任务内容填 bash /www/backup/scripts/backup.sh,周期设为每天凌晨 3 点。第一次配置完先点“执行”手动跑一次,看输出里有没有报错,再交给定时器。
本地备份只能防误删,防不了整机故障,所以异地这一环不能省。如果备份机是另一台 VPS,最简单的方式是在目标机器上开 FTP 或 SFTP,源机器用 lftp 上传。宝塔面板的「FTP 存储」在计划任务里可以直接勾选,把上面脚本产出的目录作为上传源即可。
如果不想自己维护 FTP 服务,对象存储更省心。以兼容 S3 协议的对象存储为例,可以用 rclone 或 s3cmd 这类工具上传,宝塔的「对象存储」插件也支持常见厂商。核心思路都是把 ${BACKUP_DIR} 同步到远端桶中的一个固定前缀下。下面给一个 rclone 的示例,配置好 remote 之后执行:
# 把本地备份目录同步到远端桶,--min-age 用于只传新文件
rclone sync /www/backup/site_manual/ myremote:my-bucket/site-backup/ \
--transfers 2 --checkers 4 --log-file /www/backup/rclone.log --log-level INFO
对象存储上传时注意两点:一是生命周期规则,可以在云端设置 30 天或 90 天自动删除旧对象,避免费用越滚越大;二是上传失败要有感知,建议在脚本最后判断远端对象数量和本地是否一致,或者让 rclone 的日志出现 ERROR 时触发宝塔的“消息通知”,通过邮件、钉钉或企业微信提醒你。
另外,异地备份的账号权限建议最小化,只给目标目录的写入权限,不要用主账号密钥;FTP 也别用面板默认的匿名或弱口令账号。备份传输过程本身也是敏感数据流动,能走 SFTP 或 HTTPS 就不要走明文 FTP。
备份文件生成后,至少要验证它“是完整的”。SQL 压缩包可以解压后看末尾是否有 Dump completed 字样,tar 包可以用 tar -tzf 列出内容而不解压,能列出来说明头部结构没坏。下面这条命令可以快速检查:
# 检查 gzip 完整性
gzip -t /www/backup/site_manual/db_exampledb_20260901_030000.sql.gz && echo "gz ok"
列出 tar 包内容并统计文件数量
tar -tzf /www/backup/site_manual/site_20260901_030000.tar.gz | wc -l
更关键的是恢复演练。建议每隔一两个月,在测试目录或测试库里实际恢复一次:把 tar 包解到临时目录,把 SQL 导入一个临时数据库,确认站点能跑起来、文章和附件数量对得上。演练时不要直接覆盖生产环境,用另一套路径和库名验证即可。只有真正恢复成功过一次,这套备份才算可信。
最后给一个落地顺序:先配好本地每日备份并确认文件能生成,再接入异地存储,第三步加上失败告警,最后安排一次恢复演练。整套流程不需要多高深的技术,但每一步都能在关键时刻救回你的网站。备份策略也要随业务变化调整,比如上了新插件、换了数据库引擎,记得回头检查脚本是否还适用。
| 📑 | 📅 |
|---|---|
| WordPress数据库膨胀排查:wp_options自动加载与孤立表清理 | 2026-09-15 |
| Let's Encrypt证书自动续期失败排查:certbot renew定时任务与webroot验证 | 2026-09-15 |
| Nginx反向代理缓存实战:proxy_cache_path配置与命中率排查 | 2026-09-15 |
| 大文件上传总失败:php.ini与Nginx三处限制如何协调放行 | 2026-09-14 |
| phpMyAdmin导入大SQL超时:参数调整与命令行导入 | 2026-09-12 |
| CDN回源配置怎么填:回源Host、回源协议与真实IP排查 | 2026-09-16 |
| WordPress固定链接改版后老链接404:rewrite与301重定向保住收录 | 2026-09-16 |
| 宝塔面板MySQL与PHP版本切换:兼容性检查、扩展重装与白屏处理 | 2026-09-16 |
| 宝塔PHP扩展装不上怎么办:编译报错与权限排查 | 2026-09-16 |
| Nginx与PHP-FPM超时怎么配:三处超时参数的关系与取舍 | 2026-09-16 |