74 lines
2.2 KiB
Markdown
74 lines
2.2 KiB
Markdown
|
|
# 数据迁移工具
|
|||
|
|
|
|||
|
|
用于将测试数据库的数据迁移到生产数据库,避免ID冲突,使用事务确保数据一致性。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
- ✅ 自动避免ID冲突(使用数据库自增ID)
|
|||
|
|
- ✅ 使用事务确保每个任务和结果数据的一致性
|
|||
|
|
- ✅ 自动跳过已存在的任务(基于task_uuid)
|
|||
|
|
- ✅ 保留原始时间戳
|
|||
|
|
- ✅ 处理NULL值
|
|||
|
|
- ✅ 详细的日志输出和统计信息
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
### 基本用法
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 从dev环境迁移到prod环境
|
|||
|
|
go run cmd/migrate/main.go -test-env=dev -prod-env=prod
|
|||
|
|
|
|||
|
|
# 从prod环境迁移到dev环境(测试反向迁移)
|
|||
|
|
go run cmd/migrate/main.go -test-env=prod -prod-env=dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 参数说明
|
|||
|
|
|
|||
|
|
- `-test-env`: 测试环境配置文件名(dev/prod),默认值:dev
|
|||
|
|
- `-prod-env`: 生产环境配置文件名(dev/prod),默认值:prod
|
|||
|
|
|
|||
|
|
### 编译后使用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 编译
|
|||
|
|
go build -o migrate cmd/migrate/main.go
|
|||
|
|
|
|||
|
|
# 运行
|
|||
|
|
./migrate -test-env=dev -prod-env=prod
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 工作原理
|
|||
|
|
|
|||
|
|
1. **连接数据库**:同时连接测试数据库和生产数据库
|
|||
|
|
2. **读取数据**:从测试数据库读取所有任务和结果数据(LEFT JOIN)
|
|||
|
|
3. **检查重复**:基于`task_uuid`检查生产数据库中是否已存在
|
|||
|
|
4. **事务迁移**:为每个任务创建独立事务:
|
|||
|
|
- 创建任务记录(自动生成新ID)
|
|||
|
|
- 如果存在结果数据,创建结果记录(关联新任务ID)
|
|||
|
|
- 提交事务或回滚
|
|||
|
|
5. **统计报告**:输出迁移统计信息
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **配置文件**:确保`config/config_dev.yaml`和`config/config_prod.yaml`存在且配置正确
|
|||
|
|
2. **数据库权限**:确保数据库用户有读写权限
|
|||
|
|
3. **网络连接**:确保能同时连接到两个数据库
|
|||
|
|
4. **数据备份**:迁移前建议备份生产数据库
|
|||
|
|
5. **ID冲突**:脚本会自动处理ID冲突,使用数据库自增ID,不会覆盖现有数据
|
|||
|
|
|
|||
|
|
## 输出示例
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
从测试数据库读取到 100 条任务记录
|
|||
|
|
[1/100] 创建任务成功: task_uuid=xxx, 新ID=1001
|
|||
|
|
[1/100] 创建结果成功: task_id=1001
|
|||
|
|
[2/100] 跳过已存在的任务: task_uuid=yyy, id=1002
|
|||
|
|
...
|
|||
|
|
迁移完成统计:
|
|||
|
|
成功: 95 条
|
|||
|
|
跳过: 3 条
|
|||
|
|
失败: 2 条
|
|||
|
|
数据迁移完成!
|
|||
|
|
```
|