---
name: db-backup
description: >
  当用户要求备份数据库、恢复数据、验证备份、清理过期备份时使用。
  覆盖手动备份、多种恢复场景、云端同步、备份验证。
  触发短语：备份数据库、恢复数据、db backup、db restore、灾难恢复。
---

# 数据库备份运维技能

## 备份策略（参考 `docs/ops/03-ops-policy.md` "备份策略" 章节）

- 3-2-1 原则：3 份副本、2 种介质、1 份异地
- 保留策略：本地 7 天、云端 30 天
- 命名格式：`ffoa_backup_YYYYMMDD_HHMMSS.sql.gz`

## 备份方法

### 方法 1：项目脚本
```bash
bash scripts/deploy/deploy.sh db:backup
```

### 方法 2：直接 pg_dump
```bash
docker exec <postgres_container> pg_dump -U <user> <dbname> | gzip > backup.sql.gz
```

## 恢复场景

### 场景 1：部署后快速回滚
```bash
bash scripts/deploy/deploy.sh db:restore <backup_file>
```

### 场景 2：从备份文件恢复
```bash
pm2 stop all
gunzip < <backup_file> | docker exec -i <postgres_container> psql -U <user> <dbname>
pm2 restart all
```

### 场景 3：从云端恢复
先下载备份文件到本地，再按场景 2 恢复。

### 场景 4：灾难恢复（新服务器）
1. 用 `deploy-ops` skill 完成首次部署
2. 下载最近的云端备份
3. 按场景 2 恢复数据库
4. 验证

## 验证备份完整性

将备份恢复到临时容器，检查表数量和关键数据：
```bash
docker run --rm -e POSTGRES_PASSWORD=test -d --name verify-db postgres:16-alpine
gunzip < <backup> | docker exec -i verify-db psql -U postgres
# 检查表数量、关键记录
docker rm -f verify-db
```

## 清理过期备份

```bash
find /srv/apps/ffoa/backups -name "*.sql.gz" -mtime +30 -delete
```

## 关键约束

- 生产环境部署前 deploy.sh 会自动备份
- 恢复前必须先停应用（`pm2 stop all`），恢复后重启
- 容器名和数据库名从 `.env` 和 `docs/ops/01-server-infrastructure.md` 获取
