Files
2026-10-20 21:19:44 +08:00

88 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 11.9 备份与恢复
:::tip 概述
备份对象:数据库(核心)、上传文件、配置与密钥。恢复演练与备份同等重要——未经验证的备份不算备份。
:::
## 备份对象与策略
| 对象 | 方式 | 频率 | 保留 |
|------|------|------|------|
| MySQL | mysqldump / xtrabackup | 全量每日 + binlog | 30 天 + 月度归档 |
| 上传文件 upload/ | rsync 快照 / 对象存储同步 | 每日增量 | 30 天 |
| 配置与密钥 | 私有仓库/密钥库 | 变更时 | 长期 |
| Redis | 不备份(缓存可重建) | — | — |
::: warning Redis 不备份的边界
Redis 存黑名单/在线会话/验证码——不备份可接受(重启后会话重登录,令牌黑名单靠 TTL 自然过期)。若"强退立即生效"是合规要求,接受重启窗口内的令牌复活风险或启用 Redis 持久化(RDB)。
:::
## MySQL 备份脚本示例
```sh
#!/bin/bash
# backup.sh — 每日全量
DATE=$(date +%Y%m%d_%H%M%S)
DB=easygoadmin.goframe.elevue
DIR=/backup/mysql
mysqldump -uroot -p"$DB_PASS" --single-transaction --routines --triggers \
"$DB" | gzip > "$DIR/${DB}_${DATE}.sql.gz"
# 保留 30 天
find "$DIR" -name "*.sql.gz" -mtime +30 -delete
```
crontab:`0 2 * * * /opt/backup/backup.sh`(避开 LogClean 02:30 高峰可调 01:30)。
## 上传文件备份
```sh
# rsync 增量(upload 目录每日变化小)
rsync -a --delete /opt/easygoadmin/upload/ /backup/upload/
```
多实例共享卷场景:备份一份共享卷即可。
## 恢复流程
```text
数据库恢复:
1. 停服务(防写入)
2. mysql -uroot -p "$DB" < 解压后的.sql(或 xtrabackup --copy-back)
3. 验证:表数量 / admin 账号 / 行数抽查
4. 启服务 → health + 冒烟
上传文件恢复:
rsync 回源目录 → 验证图片/文件可访问
```
## 恢复演练(季度)
```text
□ 独立恢复环境拉起(勿在生产演练)
□ 全量备份恢复 → 数据完整性核对(表/行数/关键数据)
□ 记录恢复耗时(RTO 评估)
□ 修正备份脚本缺陷
```
## RPO / RTO 参考
| 方案 | RPO(最大数据丢失) | RTO(恢复耗时) |
|------|--------------------|-----------------|
| 每日全量 | ≤24h | 30min~2h(视数据量) |
| 全量+binlog 增量 | 近零(秒级) | 1h~4h |
| 主从/双机热备 | 秒级 | 分钟级(自动切换) |
按业务容忍度选择——中后台系统每日全量+binlog 通常足够。
## 备份安全
```text
□ 备份文件加密存储(含全量数据=敏感资产)
□ 异地存储(防机房级故障)
□ 访问权限最小化(备份账号只读)
□ 传输通道加密(scp/rsync over ssh)
□ 备份保留与合规对齐(操作日志保留 90 天为默认下限)
```