# 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 ``` 示例: ```bash go run main.go -project 123 ``` ### 替换UID ```bash go run main.go -project -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. 监控数据库性能指标