Files
playground/cmd/message-migrator/README.md
XuanLee-HEALER df39693dff commit
2025-11-10 15:30:21 +08:00

147 lines
4.6 KiB
Markdown
Raw 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.

# Message Migrator 数据迁移工具
这个工具用于将指定项目的消息数据从源数据库迁移到目标数据库。
## 功能特性
- ✅ 按项目ID迁移数据
- ✅ 支持可选的UID替换
- ✅ 自动处理表之间的ID关联映射
- ✅ 使用事务保证数据一致性
- ✅ 按正确的依赖顺序迁移:`m_stream_messages``m_stream_contents``m_context_messages``m_task_messages`
## 涉及的表
1. `m_stream_messages` - 流式消息记录表(主表)
2. `m_stream_contents` - 流式消息内容详情及分段表
3. `m_context_messages` - Agent上下文消息记录表
4. `m_task_messages` - 任务聚合消息记录表
## 安装依赖
```bash
go get github.com/go-sql-driver/mysql
```
## 配置
在使用前,请修改 `main.go` 中的数据库连接配置:
```go
const (
// 源数据库 DSN 格式: user:password@tcp(host:port)/database?parseTime=true
SOURCE_DSN = "user:password@tcp(localhost:3306)/goalfymax_prod?parseTime=true"
// 目标数据库 DSN
TARGET_DSN = "user:password@tcp(localhost:3306)/goalfymax_archive?parseTime=true"
)
```
## 使用方法
### 基本用法保持原始UID
```bash
go run main.go -project <project_id>
```
示例:
```bash
go run main.go -project 123
```
### 替换UID
```bash
go run main.go -project <project_id> -uid <new_uid>
```
示例:
```bash
go run main.go -project 123 -uid 456
```
### 自定义数据库连接
```bash
go run main.go -project 123 \
-source "root:pass@tcp(source-host:3306)/goalfymax_prod?parseTime=true" \
-target "root:pass@tcp(target-host:3306)/goalfymax_archive?parseTime=true"
```
### 编译后使用
```bash
# 编译
go build -o message-migrator
# 运行
./message-migrator -project 123
./message-migrator -project 123 -uid 456
```
## 参数说明
| 参数 | 必需 | 说明 | 示例 |
| ---------- | ---- | ------------------------------------------- | --------------------------------------- |
| `-project` | 是 | 要迁移的项目ID | `-project 123` |
| `-uid` | 否 | 新的用户ID不指定则使用原始UID | `-uid 456` |
| `-source` | 否 | 源数据库DSN不指定则使用代码中的默认值 | `-source "user:pass@tcp(host:3306)/db"` |
| `-target` | 否 | 目标数据库DSN不指定则使用代码中的默认值 | `-target "user:pass@tcp(host:3306)/db"` |
## 迁移流程
1. **连接数据库**:连接到源数据库和目标数据库
2. **开启事务**:在两个数据库上分别开启事务
3. **迁移主表**:迁移 `m_stream_messages`记录旧ID到新ID的映射
4. **迁移关联表**
- 迁移 `m_stream_contents`,使用映射更新 `main_message_id`
- 迁移 `m_context_messages`,使用映射更新 `main_message_id`
- 迁移 `m_task_messages`,使用映射更新 `main_message_id`
5. **提交事务**:所有数据迁移成功后提交事务
## 注意事项
⚠️ **重要提示**
1. **备份数据**:在执行迁移前,请务必备份源数据库和目标数据库
2. **目标表存在**:工具不会创建表,请确保目标数据库中已存在所有需要的表结构
3. **事务一致性**:迁移过程使用事务,如果中途失败会自动回滚
4. **ID映射**:工具会自动处理 `main_message_id` 的映射关系,确保关联正确
5. **UID替换**:如果指定了 `-uid` 参数,所有表中的 `uid` 字段都会被替换为新值
6. **重复执行**:请注意,重复执行相同的迁移命令可能会导致数据重复
## 日志输出
工具会输出详细的迁移日志:
```
2025/11/07 10:00:00 Starting migration for project_id=123
2025/11/07 10:00:00 Will replace UID with: 456
2025/11/07 10:00:01 Step 1: Migrating m_stream_messages...
2025/11/07 10:00:02 Migrated 150 stream messages
2025/11/07 10:00:02 Step 2: Migrating m_stream_contents...
2025/11/07 10:00:03 Migrated 300 stream contents
2025/11/07 10:00:03 Step 3: Migrating m_context_messages...
2025/11/07 10:00:04 Migrated 200 context messages
2025/11/07 10:00:04 Step 4: Migrating m_task_messages...
2025/11/07 10:00:05 Migrated 180 task messages
2025/11/07 10:00:05 Migration completed successfully!
```
## 错误处理
如果迁移过程中遇到错误:
- 事务会自动回滚,不会产生部分数据
- 错误信息会显示在日志中
- 检查数据库连接、权限和表结构是否正确
## 性能建议
对于大量数据的迁移:
1. 在非高峰期执行
2. 确保数据库有足够的临时空间
3. 可以考虑先迁移到测试环境验证
4. 监控数据库性能指标