小皮面板本身没有“直传云盘”的备份开关,**可行且最稳的做法是:用面板的计划任务定时执行一段脚本,先 mysqldump 导出并用 gzip 压缩,再用 rclone(或 ossutil/coscmd)上传到云盘或对象存储,最后按天数清理本地旧备份**。结论:本地留 14 天、云端留 30 天以上,每天凌晨 3:00 跑一次,脚本 20 行以内就能搞定。
小皮面板能直接备份到云盘吗?
不能。小皮面板的计划任务提供“备份网站”“备份数据库”“备份目录”“执行脚本”“访问 URL”几类动作,备份产物一律落在服务器本地目录,面板没有内置的云盘对接入口。所以要么用“备份数据库”任务先落到本地,再叠加一个“执行脚本”任务做上传;要么干脆一个“执行脚本”任务把导出和上传一起做完。后者链路更短、失败点更少,推荐后者。
导出脚本怎么写?
核心结论:mysqldump 必须带 --single-transaction,否则 InnoDB 表在备份期间会被锁住,线上业务会明显卡顿。下面这段脚本放到 /www/backup/db_backup.sh:
#!/bin/bash
DB=gj_forum
DIR=/www/backup/db
KEEP=14
mkdir -p $DIR
mysqldump --defaults-extra-file=/root/.my.cnf \
--single-transaction --quick --routines --triggers --events \
--default-character-set=utf8mb4 $DB \
| gzip > $DIR/${DB}_$(date +%F_%H%M).sql.gz
find $DIR -name "${DB}_*.sql.gz" -mtime +$KEEP -delete
rclone copy $DIR oss:gj-backup/db/ --include "*.sql.gz" \
--transfers 4 --log-file /www/backup/log/rclone.log --log-level INFO
密码不要写进脚本,单独建 /root/.my.cnf,内容三行 [client]、user=root、password=你的密码,然后 chmod 600 /root/.my.cnf。这样脚本里不出现明文密码,也不会因为 -p 后面直接跟密码而在 ps 里被看到。要给全部库做备份,把 $DB 换成 --all-databases 即可。
云盘怎么接?rclone 还是厂商 CLI?
结论:多云混用选 rclone,只用一家国内对象存储选厂商 CLI(ossutil / coscmd),后者少一层抽象、出错信息更直白。
rclone 装好(curl https://rclone.org/install.sh | sudo bash)后执行 rclone config 新建 remote:阿里云 OSS 选 s3 类型,provider 填 Alibaba,endpoint 填 oss-cn-hangzhou.aliyuncs.com;腾讯云 COS 同样走 s3,provider 填 TencentCOS;坚果云、Nextcloud 这类选 webdav,坚果云地址是 https://dav.jianguoyun.com/dav,账号是邮箱、密码是应用密码而不是登录密码。配完先手动跑一次 rclone lsd oss: 确认能列出桶,再挂进脚本。
定时任务怎么设、保留多久?
在面板「计划任务」里新建任务,类型选“执行脚本”,周期选“每天”、时间填 03:00,脚本路径填 /bin/bash /www/backup/db_backup.sh。如果你的面板版本计划任务不带 shell 解释器选项,就在脚本首行写好 shebang 并 chmod +x。
保留策略给两个数字:本地 KEEP=14(14 天,够覆盖“上周改坏了想回滚”的场景),云端建议保留 30 天以上,在对象存储侧配生命周期规则自动删除,比在脚本里删更可靠——脚本挂了不会连带把云端清理掉。
怎么确认备份真能恢复?
结论:没做过恢复演练的备份等于没有备份,每月至少抽一次验证。三步:gzip -t 文件名.sql.gz 校验压缩包完整;rclone ls oss:gj-backup/db/ | tail -3 确认最近三次都在;把最新包拉到临时目录,zcat x.sql.gz | head -50 看建表语句是否完整,再导入一台测试库跑 CHECK TABLE。日志统一写到 /www/backup/log/,脚本里 set -uo pipefail 加上失败退出,配合面板任务的执行记录,出现“备份成功但上传失败”能第一时间发现。
三个常见坑
第一,--single-transaction 只对 InnoDB 有效,库里还有 MyISAM 表就得加 --lock-tables,并挪到低峰期。第二,Windows 版小皮面板没有 crontab,要用 Windows 任务计划程序调用 bat,路径里带空格的目录(如 D:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqldump.exe)必须整体加英文双引号。第三,时区不对会让文件名日期错一天,脚本里加一行 export TZ=Asia/Shanghai 最省事。
把上面这套跑通后,脚本和排错记录可以打包成 zip 传到 GJ 站长论坛的运维版块,普通附件单个最大 10MB、支持 zip/rar/7z,够放脚本加日志样本;遇到坑也可以在那边发帖,签到和发主题都能拿金币。