147 lines
4.6 KiB
Markdown
147 lines
4.6 KiB
Markdown
# 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. 监控数据库性能指标
|