网站数据要随时存一份。备份做得好,出问题能原样找回,不用慌。
能做什么
- 一键备份数据库,也能连同上传文件一起打包。
- 备份文件可以下载、删除,也能用来恢复。
- 可以按计划自动备份,不用天天手动点。
- 恢复前系统会自动再存一份,留个后路。
手动备份怎么做
- 登录后台,进入「系统设置 → 数据备份」页。
- 点一键备份。需要连上传文件一起存,就勾选「连同上传文件」。
- 备份完成后,列表里会出现一条记录,包含文件名、类型、大小、SHA256、来源、创建人和时间。
- 要下载就点「下载」,文件以附件形式输出,只有登录管理员能访问,并会写入审计日志。
备份文件保存在 data/backups/,这个目录在站点根目录 public/ 之外,首次备份时自动创建。文件名带时间戳和随机部分,不能靠猜地址下载。
数据库备份默认压缩,保存为 .sqlite.gz。可以在「系统设置 → 数据备份」里关闭「压缩备份文件」,关闭后保存为未压缩的 .sqlite。
恢复怎么做
- 在列表里展开「恢复」,输入站点名称或「确认」。
- 系统先校验所选文件,校验失败会拒绝恢复。
- 校验通过后,系统自动生成一份「恢复前」备份。
- 用备份里的数据覆盖当前数据库,保留当前的数据库结构。
- 恢复完成后清除全部登录会话,所有管理员需要重新登录。
恢复会覆盖当前数据,请在低峰期操作,并确认选择的是正确的备份。
定时备份怎么设
在「系统设置 → 数据备份」里配置:
| 设置项 | 默认值 | 说明 |
|---|---|---|
| 自动备份间隔 | 每天 | 可选关闭、每天、每周(每周在周一执行) |
| 执行时间 | 03:15 | 按站点时区执行,格式 HH:MM |
| 最多保留备份份数 | 15 | 超出后自动删除最旧的定时备份;手动备份与「恢复前」备份不会自动删除 |
| 压缩备份文件 | 开启 | 数据库备份存为 .sqlite.gz;关闭后存为未压缩的 .sqlite |
| 自动整理数据库 | 每周 | 可选关闭、每周;只在 cron:run 里执行 VACUUM |
| 整理星期 | 周日 | 按站点时区计算 |
| 整理执行时间 | 03:45 | 按站点时区执行,格式 HH:MM |
| 整理后优化统计 | 开启 | 整理完成后执行 PRAGMA optimize |
定时备份只备份数据库,不包含上传文件。调度器每分钟由 cron:run 检查一次是否到期,同一天(或同一周)只执行一次。
配置调度器
把 /var/www/kingcms 和 PHP 路径换成服务器上的实际路径,建议每分钟运行一次。
系统 crontab
* * * * * /usr/bin/php /var/www/kingcms/bin/kingcms cron:run >> /var/www/kingcms/data/cron.log 2>&1
用运行网站的用户(通常是 www-data)配置,避免生成的文件属主不对:
sudo -u www-data crontab -e
systemd service + timer
/etc/systemd/system/kingcms-cron.service:
[Unit]
Description=KingCMS 定时任务
[Service]
Type=oneshot
User=www-data
ExecStart=/usr/bin/php /var/www/kingcms/bin/kingcms cron:run
/etc/systemd/system/kingcms-cron.timer:
[Unit]
Description=每分钟运行 KingCMS 定时任务
[Timer]
OnCalendar=*:0/1
Persistent=true
[Install]
WantedBy=timers.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable --now kingcms-cron.timer
宝塔面板
在「计划任务」新建 Shell 脚本任务,执行周期选「N 分钟」并填 1,脚本内容与上面的 crontab 命令相同。保存后手动运行一次,确认没有报错。
虚拟主机
使用主机商提供的「定时任务」或「Cron Jobs」功能,按分钟执行上面的命令。不能执行 Shell 的主机无法使用自动备份,只能手动在后台备份。
Windows 任务计划程序
新建任务,触发器选「每天」并勾选「重复任务间隔 1 分钟」、持续时间「无限期」;操作选「启动程序」:
C:\php\php.exe C:\kingcms\x1\bin\kingcms cron:run
起始于填写 C:\kingcms。
确认是否在运行
「系统设置 → 数据备份」页显示:
- 上次运行:调度器最近一次执行
cron:run的时间。 - 上次自动备份:最近一次定时备份的创建时间。
- 数据库文件大小 / 可回收空间 / 上次整理:数据库占用与整理结果;点「立即整理」可手动加入整理队列。
调度器超过 10 分钟没有运行,或者从未运行过,页面顶部会出现黄色警告条。
整理数据库
删除数据后,SQLite 文件不会自动变小。每周整理会执行 VACUUM,把文件重写为紧凑的副本;整理后如果开启「整理后优化统计」,还会执行 PRAGMA optimize。
- 整理只由命令行调度器
cron:run执行,web 请求不会直接执行VACUUM。 - 整理前如果 24 小时内没有成功备份,会先自动创建一份定时备份;自动备份失败时跳过本次整理。
- 拿不到整理锁或数据库被占用时跳过并写日志,下个周期再试。
- 点「立即整理」并确认后,只会把整理任务加入队列,由调度器在后台执行。
- 每次整理都会写入审计日志,动作为
backup.vacuum。
整理期间会占用数据库写锁,建议安排在低峰时段。数据库较大时整理需要更长时间。
要单独备份的文件
app.key 不包含在备份里。它用于解密设置中的密钥字段,换服务器或重装系统时请单独备份 data/app.key,否则数据库里的 DeepSeek 密钥、支付私钥、接口密钥等无法解密。
常见故障
- 上次运行一直不更新:先在命令行手动执行
php bin/kingcms cron:run看报错;确认 crontab 里的 PHP 路径正确,并且执行用户对data/有写权限。 - 命令找不到 PHP:用
which php或command -v php查出绝对路径再填进 crontab。 - 备份失败:检查磁盘空间与
data/权限;备份目录需要可写、可创建。提示未启用 sqlite3 扩展时,安装 PHP 的sqlite3扩展并重启 PHP-FPM。 - 执行时间不对:「执行时间」按站点时区计算,修改「系统设置 → 设置 → 站点基本 → 基本信息」中的站点时区后以下次运行为准。
- 连同媒体打包失败:服务器需要启用 PHP 的 zip 扩展。上传目录不存在时只打包数据库。
- 日志位置:crontab 里把输出重定向到
data/cron.log后在此查看;宝塔面板的「计划任务」里也可以查看执行日志;PHP-FPM 或 Web 服务器的错误日志会记录备份异常。