# 考培练系统数据库回滚指南

## 概述

考培练系统支持基于MySQL Binlog的数据库回滚功能，可以快速恢复误操作导致的数据变更。本指南提供了完整的回滚操作流程和最佳实践。

## 回滚方案对比

| 方案 | 适用场景 | 优点 | 缺点 | 推荐度 |
|------|----------|------|------|--------|
| **Binlog回滚** | 精确时间点回滚 | 精确、完整 | 需要技术知识 | ⭐⭐⭐⭐⭐ |
| **软删除恢复** | 删除操作回滚 | 简单、安全 | 仅限软删除 | ⭐⭐⭐⭐ |
| **备份恢复** | 大规模回滚 | 完整恢复 | 可能丢失新数据 | ⭐⭐⭐ |
| **手动修复** | 小范围修复 | 灵活 | 容易出错 | ⭐⭐ |

## 一、Binlog回滚（推荐）

### 1.1 前提条件检查

```bash
# 检查Binlog是否启用
docker exec kaopeilian-mysql mysql -uroot -proot -e "SHOW VARIABLES LIKE 'log_bin';"

# 检查Binlog格式（推荐ROW格式）
docker exec kaopeilian-mysql mysql -uroot -proot -e "SHOW VARIABLES LIKE 'binlog_format';"

# 查看可用的Binlog文件
docker exec kaopeilian-mysql mysql -uroot -proot -e "SHOW BINARY LOGS;"
```

### 1.2 使用专用回滚工具

#### 查看最近变更
```bash
cd /Users/nongjun/Desktop/Ai公司/本地开发与测试/kaopeilian-backend
python scripts/kaopeilian_rollback.py --list --hours 24
```

#### 回滚用户操作
```bash
# 模拟回滚（查看会执行什么操作）
python scripts/kaopeilian_rollback.py --rollback-user 123 --operation-type delete

# 实际执行回滚
python scripts/kaopeilian_rollback.py --rollback-user 123 --operation-type delete --execute
```

#### 回滚课程操作
```bash
# 回滚课程删除
python scripts/kaopeilian_rollback.py --rollback-course 456 --operation-type delete --execute

# 回滚课程更新（需要手动处理）
python scripts/kaopeilian_rollback.py --rollback-course 456 --operation-type update
```

#### 回滚考试操作
```bash
# 回滚考试记录（会同时删除考试和考试结果）
python scripts/kaopeilian_rollback.py --rollback-exam 789 --execute
```

### 1.3 使用简化回滚工具

#### 查看Binlog文件
```bash
python scripts/simple_rollback.py --list
```

#### 基于时间点回滚
```bash
# 模拟回滚到指定时间点
python scripts/simple_rollback.py --time "2024-12-20 10:30:00"

# 实际执行回滚
python scripts/simple_rollback.py --time "2024-12-20 10:30:00" --execute
```

### 1.4 使用完整Binlog工具

```bash
# 查看帮助
python scripts/binlog_rollback_tool.py --help

# 列出Binlog文件
python scripts/binlog_rollback_tool.py --list-binlogs

# 回滚到指定时间点
python scripts/binlog_rollback_tool.py --time "2024-12-20 10:30:00" --execute
```

## 二、软删除恢复

### 2.1 恢复用户
```sql
-- 恢复软删除的用户
UPDATE users SET is_deleted = FALSE, deleted_at = NULL WHERE id = 123;
```

### 2.2 恢复课程
```sql
-- 恢复软删除的课程
UPDATE courses SET is_deleted = FALSE, deleted_at = NULL WHERE id = 456;
```

### 2.3 恢复岗位
```sql
-- 恢复软删除的岗位
UPDATE positions SET is_deleted = FALSE, deleted_at = NULL WHERE id = 789;
```

## 三、备份恢复

### 3.1 创建完整备份
```bash
# 创建数据库完整备份
docker exec kaopeilian-mysql mysqldump -uroot -proot --single-transaction --routines --triggers kaopeilian > backup_$(date +%Y%m%d_%H%M%S).sql
```

### 3.2 恢复备份
```bash
# 恢复数据库备份
docker exec -i kaopeilian-mysql mysql -uroot -proot kaopeilian < backup_20241220_103000.sql
```

## 四、常见回滚场景

### 4.1 误删用户
```bash
# 1. 查看最近删除的用户
python scripts/kaopeilian_rollback.py --list --hours 1

# 2. 恢复软删除的用户
python scripts/kaopeilian_rollback.py --rollback-user 123 --operation-type delete --execute
```

### 4.2 误删课程
```bash
# 1. 恢复软删除的课程
python scripts/kaopeilian_rollback.py --rollback-course 456 --operation-type delete --execute

# 2. 恢复课程关联数据（如果需要）
# 手动执行SQL恢复课程资料、知识点等
```

### 4.3 误删考试记录
```bash
# 1. 恢复考试记录（会同时恢复考试结果）
python scripts/kaopeilian_rollback.py --rollback-exam 789 --execute
```

### 4.4 批量误操作
```bash
# 1. 基于时间点回滚
python scripts/simple_rollback.py --time "2024-12-20 10:30:00" --execute

# 2. 或使用完整备份恢复
docker exec -i kaopeilian-mysql mysql -uroot -proot kaopeilian < backup_before_operation.sql
```

## 五、最佳实践

### 5.1 回滚前准备
1. **创建备份**：回滚前必须创建当前数据备份
2. **确认时间点**：精确确定需要回滚到的时间点
3. **评估影响**：评估回滚操作对系统的影响
4. **通知用户**：必要时通知相关用户

### 5.2 回滚操作流程
1. **停止服务**：停止可能影响数据的服务
2. **创建备份**：备份当前状态
3. **执行回滚**：使用合适的回滚工具
4. **验证数据**：验证回滚结果
5. **重启服务**：恢复服务运行
6. **记录日志**：记录回滚操作日志

### 5.3 安全注意事项
- 回滚操作不可逆，务必谨慎
- 生产环境回滚前必须在测试环境验证
- 重要操作需要多人确认
- 保留回滚操作日志

## 六、故障排除

### 6.1 Binlog未启用
```bash
# 检查MySQL配置
docker exec kaopeilian-mysql mysql -uroot -proot -e "SHOW VARIABLES LIKE 'log_bin';"

# 如果未启用，需要修改MySQL配置并重启
```

### 6.2 Binlog文件过大
```bash
# 清理旧的Binlog文件
docker exec kaopeilian-mysql mysql -uroot -proot -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
```

### 6.3 回滚工具执行失败
1. 检查数据库连接
2. 确认权限设置
3. 查看错误日志
4. 手动执行SQL语句

## 七、监控与预防

### 7.1 设置监控
- 监控Binlog文件大小
- 监控数据库操作日志
- 设置异常操作告警

### 7.2 预防措施
- 定期备份数据库
- 设置操作权限控制
- 实施操作审计
- 提供操作确认机制

## 八、联系支持

如遇到回滚问题，请联系技术支持：
- 查看系统日志：`docker logs kaopeilian-mysql`
- 查看应用日志：`docker logs kaopeilian-backend`
- 提交问题报告：包含错误信息、操作步骤、时间点等

---

**重要提醒**：数据库回滚是高风险操作，请务必在充分理解操作影响的前提下执行，建议在测试环境先验证回滚方案的有效性。
