外观
自动备份方案说明:备份脚本、定时任务与恢复验证流程
约 934 字
备份定时任务恢复
本说明给出本站的自动备份方案:用脚本完成数据库与站点文件的打包校验,用定时任务每日执行并清理过期副本,再用一次真实恢复验证备份可用。三者缺一不可,只做备份不做恢复验证等同于没有备份。
一、适用范围
- 适用:单机部署的站点,数据由 MariaDB 数据库加 /srv/axis 下的文件组成;需要每日一次全量备份并保留 14 天;可接受备份期间短暂的文件读取延迟。
- 不适用:数据量超过单机磁盘、需要增量或持续归档(PITR)的场景;跨机房容灾;要求 RPO 小于 1 小时的业务。
二、准备工作
| 项目 | 要求 | 检查方法 |
|---|---|---|
| 备份空间 | 独立分区或挂载点,剩余容量 ≥ 数据量 3 倍 | df -h /srv/axis/backup |
| 数据库账号 | 具备 SELECT、LOCK TABLES、SHOW VIEW、TRIGGER | SHOW GRANTS FOR 'backup'@'localhost'; |
| 脚本目录 | /srv/axis/scripts 存在且属主为 deploy | ls -ld /srv/axis/scripts |
| 工具 | tar、gzip、mysqldump、sha256sum 可用 | command -v mysqldump sha256sum |
| 时间基准 | 已配置时区与 NTP | timedatectl 中 synchronized 为 yes |
| 通知渠道 | 有可用的告警邮箱或 webhook | 手动发送一条测试消息成功 |
注意事项:
- 备份文件必须落在与数据不同的磁盘或主机上,同盘备份在磁盘故障时会一起丢失。
--single-transaction只对 InnoDB 有效,MyISAM 表需要额外加读锁才能保证一致。
三、操作步骤
本节拆成三个子步骤,建议按顺序执行;每一步完成后先确认结果,再进入下一步。
3.1 备份脚本编写
编写可重复执行的备份脚本,产出带校验和的数据库与文件压缩包。详见 3.1 备份脚本编写。
3.2 定时任务配置
把脚本接入 cron,固定执行时间并保留可查的执行日志。详见 3.2 定时任务配置。
3.3 恢复验证流程
在非生产目录与临时库中完整走一次恢复,量化可用性。详见 3.3 恢复验证流程。
四、验证方法
- 执行
sudo -u deploy /srv/axis/scripts/backup.sh,预期退出码为 0。 - 执行
ls -lh /srv/axis/backup/daily/,预期生成当日 tar.gz、sql.gz 与对应 .sha256 文件。 - 执行
cd /srv/axis/backup/daily && sha256sum -c axis-2026-06-08_0330.sha256,预期全部 OK。 - 执行
grep backup /srv/axis/backup/log/backup-2026-06-08_0330.log,预期含 start 与 done 两条记录。
五、常见问题
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 定时任务未执行 | cron 服务未运行,或脚本依赖的环境变量缺失 | systemctl status cron,脚本内全部使用绝对路径 |
| 备份文件为 0 字节 | 磁盘写满或 mysqldump 认证失败 | 查看日志中的 mysqldump 报错,核对磁盘与凭据文件 |
| 备份耗时逐日增长 | 保留历史副本过多,或把日志一并打包 | 检查保留策略与 exclude 规则 |
| 恢复时报 Unknown database | 导入前未创建目标库 | 先 CREATE DATABASE 再导入 |
| 定时任务报 Permission denied | 脚本无执行权限或凭据文件不可读 | 脚本 chmod 750,凭据文件 600 且属主一致 |
六、回滚与注意事项
- 回滚:删除新增的
/etc/cron.d/axis-backup并执行systemctl reload cron;脚本从/root/backup.sh.bak还原。 - 注意:保留策略按天数删除,上线前先确认
find -mtime +14的匹配范围,避免误删当日文件。 - 注意:备份包含数据库导出,属敏感数据;目录权限设为 750,传输走加密通道,不留在临时目录。