# MySQL to OceanBase 迁移工具 **Repository Path**: yjsfss/mysql2ob ## Basic Information - **Project Name**: MySQL to OceanBase 迁移工具 - **Description**: 本工具提供智能、可控、可视化的MySQL到OceanBase迁移方案。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-01-31 - **Last Updated**: 2026-07-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MySQL to OceanBase 迁移工具 ## 为什么需要这个工具? 当您需要将MySQL数据库迁移到OceanBase时,传统方式会遇到以下痛点: - ❌ **mysqldump导出后直接导入失败**:OceanBase与MySQL语法存在差异,DEFINER、存储引擎等不兼容 - ❌ **无法选择性迁移**:要么全库迁移,要么手动处理,无法只迁移特定表或对象 - ❌ **大数据量迁移困难**:单线程插入速度慢,无法批量处理 - ❌ **依赖关系处理复杂**:视图依赖表,触发器依赖表和存储过程,顺序错误导致失败 - ❌ **进度不可见**:不知道迁移到哪一步,失败后难以定位问题 - ❌ **错误恢复困难**:一个对象失败导致整个迁移中断 **本工具专门解决这些问题**,提供智能、可控、可视化的MySQL到OceanBase迁移方案。 ## 核心价值 ### 1. 智能DDL转换 自动处理MySQL与OceanBase之间的语法差异: - 移除不支持的存储引擎选项(ENGINE=xxx) - 规范化字符集(utf8 → utf8mb4) - 移除DEFINER子句(避免权限问题) - 处理分区表、全文索引、空间索引等特殊语法 - 提供转换警告,让您了解潜在兼容性问题 ### 2. 分阶段智能迁移 按照对象依赖关系自动排序,确保迁移成功: 1. **表结构**:先创建表(不带外键) 2. **表数据**:批量插入数据 3. **外键约束**:数据插入后再创建外键 4. **视图**:依赖表创建后才能创建视图 5. **函数**:独立对象 6. **存储过程**:独立对象 7. **触发器**:依赖表和存储过程,最后创建 8. **事件**:独立对象 ### 3. 对象级别控制 您可以精确控制迁移内容: - 选择特定表、视图、触发器等对象 - 按类型批量选择(如只迁移表和视图) - 预览转换后的DDL,确认无误后再迁移 ### 4. 高性能数据迁移 - 批量插入(默认1000条/批,可配置) - 支持并发迁移(默认4个并发,可配置) - 实时进度追踪,显示每张表的迁移进度 ### 5. 可视化操作 - Web界面,无需命令行操作 - 实时显示迁移进度和状态 - 详细的错误信息,快速定位问题 - 支持预览DDL,避免盲目迁移 ## 快速开始 ### 1. 启动服务 ```bash # Windows mysql2ob.exe # Linux/Mac ./mysql2ob ``` 服务启动后访问:http://localhost:3000 ### 2. 连接数据库 - **源数据库(MySQL)**:输入主机、端口、用户名、密码 - **目标数据库(OceanBase)**:输入主机、端口、用户名、密码、目标库名 ### 3. 选择迁移对象 - 选择源数据库 - 查看数据库对象统计(表、视图、触发器等数量) - 勾选需要迁移的对象 - 配置迁移选项(是否包含数据、索引、外键等) ### 4. 预览和迁移 - 点击"预览DDL"查看转换后的SQL语句 - 确认无误后点击"开始迁移" - 实时查看迁移进度和状态 ## 功能详解 ### 支持的数据库对象 | 对象类型 | 说明 | 特殊处理 | |---------|------|---------| | 表(Tables) | 表结构和数据 | 外键延迟创建,支持批量插入 | | 视图(Views) | 视图定义 | 移除DEFINER和ALGORITHM子句 | | 触发器(Triggers) | 触发器定义 | 移除DEFINER,检查FOLLOWS/PRECEDES | | 函数(Functions) | 自定义函数 | 移除DEFINER,检查NO SQL特性 | | 存储过程(Procedures) | 存储过程 | 移除DEFINER | | 事件(Events) | 事件调度器 | 移除DEFINER,提示行为差异 | ### 迁移选项 - **包含表数据**:是否迁移表中的数据 - **包含索引**:是否创建索引(除主键外) - **包含外键约束**:是否创建外键约束 - **先删除再创建**:如果目标对象已存在,先删除再创建 - **批量大小**:每次插入的行数(100-10000,默认1000) - **并发数**:并发迁移的线程数(1-16,默认4) ### DDL转换规则 #### 表结构转换 ```sql -- MySQL原始DDL CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- OceanBase转换后 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8mb4; ``` **转换内容**: - 移除 `ENGINE=InnoDB` - `CHARSET=utf8` → `CHARSET=utf8mb4` #### 视图转换 ```sql -- MySQL原始DDL CREATE DEFINER=`root`@`localhost` ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `v_users` AS SELECT * FROM `users`; -- OceanBase转换后 CREATE VIEW `v_users` AS SELECT * FROM `users`; ``` **转换内容**: - 移除 `DEFINER` 子句 - 移除 `ALGORITHM` 子句 - 移除 `SQL SECURITY` 子句 ### 进度追踪 迁移过程中实时显示: - **对象类型**:table、view、trigger、function、procedure、event - **对象名称**:当前迁移的对象名 - **阶段**:schema(结构)、data(数据)、create(创建) - **进度**:总行数、已迁移行数、百分比 - **状态**:pending(待处理)、running(运行中)、completed(完成)、failed(失败) - **错误信息**:失败时显示详细错误 ### 错误处理 - 每个对象独立处理,一个失败不影响其他对象 - 详细的错误信息,包括失败的对象和原因 - 失败的对象状态标记为"failed",可以重新迁移 ## 技术架构 ### 后端技术栈 - **语言**:Go 1.21 - **Web框架**:Gin - **数据库驱动**:go-sql-driver/mysql - **日志**:zerolog ### 核心组件 #### 1. DDLConverter(DDL转换器) 负责MySQL DDL到OceanBase DDL的语法转换 - 位置:`internal/migration/converter.go` - 功能:处理表、视图、触发器、函数、存储过程、事件的DDL转换 #### 2. SchemaProcessor(表结构处理器) 处理表结构的转换和迁移计划 - 位置:`internal/migration/schema.go` - 功能:生成表迁移计划,提取外键用于延迟创建 #### 3. DataMigrator(数据迁移器) 负责表数据的批量迁移 - 位置:`internal/migration/data.go` - 功能:批量读取源数据,批量插入目标数据库 #### 4. MigrationService(迁移服务) 核心服务,协调所有迁移操作 - 位置:`internal/service/migrate.go` - 功能:管理连接、执行迁移、追踪进度 #### 5. APIHandler(API处理器) 提供REST API接口 - 位置:`internal/handler/api.go` - 功能:处理前端请求,调用迁移服务 ### API接口 | 接口 | 方法 | 说明 | |-----|------|------| | /api/connect/mysql | POST | 连接MySQL数据库 | | /api/connect/ob | POST | 连接OceanBase数据库 | | /api/databases | GET | 获取MySQL数据库列表 | | /api/objects | GET | 获取数据库所有对象 | | /api/preview/all | POST | 预览所有对象DDL | | /api/migrate/full | POST | 开始完整迁移 | | /api/progress | GET | 获取迁移进度(SSE) | | /api/status | GET | 获取迁移状态 | ## 使用场景 ### 场景1:全库迁移 将整个MySQL数据库迁移到OceanBase,包括所有对象和数据。 **操作步骤**: 1. 连接源MySQL和目标OceanBase 2. 选择源数据库 3. 全选所有对象类型 4. 配置迁移选项(包含数据、索引、外键) 5. 预览DDL确认 6. 开始迁移 ### 场景2:只迁移表结构 只迁移表结构,不迁移数据和视图等其他对象。 **操作步骤**: 1. 连接源MySQL和目标OceanBase 2. 选择源数据库 3. 只勾选"表"类型,取消其他类型 4. 取消"包含表数据"选项 5. 预览DDL确认 6. 开始迁移 ### 场景3:增量迁移 之前已迁移过表结构,现在需要迁移新增的表和视图。 **操作步骤**: 1. 连接源MySQL和目标OceanBase 2. 选择源数据库 3. 只勾选新增的对象 4. 配置迁移选项 5. 预览DDL确认 6. 开始迁移 ### 场景4:测试环境验证 先在测试环境验证迁移,确认无误后再在生产环境执行。 **操作步骤**: 1. 连接测试环境OceanBase 2. 执行完整迁移 3. 验证数据和功能 4. 确认无误后,连接生产环境OceanBase 5. 重新执行迁移 ## 最佳实践 ### 1. 迁移前准备 - 备份源数据库 - 确认OceanBase版本兼容性 - 检查目标数据库空间是否足够 - 评估数据量,调整批量大小和并发数 ### 2. 分步迁移 对于大型数据库,建议分步迁移: - 第一步:迁移表结构(不包含数据) - 第二步:迁移表数据 - 第三步:迁移视图、函数、存储过程等 ### 3. 预览DDL 正式迁移前,务必预览DDL,检查转换是否正确: - 检查字符集转换 - 检查外键约束 - 检查视图定义 - 查看转换警告 ### 4. 监控进度 迁移过程中实时监控: - 关注失败的对象 - 查看错误信息 - 必要时暂停迁移,调整后重新开始 ### 5. 验证结果 迁移完成后验证: - 检查表结构是否一致 - 抽样检查数据是否正确 - 验证视图、存储过程是否正常工作 - 测试应用功能 ## 常见问题 ### Q1: 迁移失败后如何重试? A: 查看失败的对象和错误信息,修正问题后重新勾选失败的对象进行迁移。 ### Q2: 如何处理大数据量? A: 调整批量大小(如5000-10000)和并发数(如8-16),提高迁移速度。 ### Q3: 外键约束导致迁移失败怎么办? A: 可以先取消"包含外键约束"选项,迁移完成后再手动添加外键。 ### Q4: 视图迁移失败怎么办? A: 检查视图依赖的表是否已创建,视图定义中的函数是否已迁移。 ### Q5: 如何处理DEFINER权限问题? A: 工具会自动移除DEFINER子句,迁移后可以手动设置正确的DEFINER。 ## 项目结构 ``` mysql2ob/ ├── main.go # 主程序入口 ├── config/ │ └── config.go # 配置定义 ├── internal/ │ ├── database/ │ │ ├── mysql.go # MySQL客户端 │ │ ├── oceanbase.go # OceanBase客户端 │ │ └── types.go # 数据类型定义 │ ├── handler/ │ │ └── api.go # API处理器 │ ├── migration/ │ │ ├── converter.go # DDL转换器 │ │ ├── schema.go # 表结构处理器 │ │ └── data.go # 数据迁移器 │ └── service/ │ └── migrate.go # 迁移服务 ├── web/ │ ├── index.html # 前端页面 │ ├── style.css # 样式文件 │ └── app.js # 前端逻辑 ├── go.mod # Go模块定义 └── go.sum # 依赖锁定 ``` ## 依赖项 ``` github.com/gin-gonic/gin v1.9.1 # Web框架 github.com/go-sql-driver/mysql v1.7.1 # MySQL驱动 github.com/rs/zerolog v1.31.0 # 日志库 ``` ## 版本历史 ### v2.0 - 支持所有数据库对象迁移(表、视图、触发器、函数、存储过程、事件) - 智能DDL转换 - 分阶段迁移 - 对象级别选择 - 实时进度追踪 - Web界面操作 ### v1.0 - 基础表结构和数据迁移 ## 维护信息 - **作者**:yjsfss ## 支持我们 风雪中,无人是孤岛。你的支持,是我们继续免费的灯塔。 如果您觉得本工具对您有帮助,欢迎通过以下方式捐款支持我们的开发: ### 捐款方式 | 支付方式 | 二维码 | |---------|-------| | 支付宝 | 支付宝捐款 | | 微信 | 微信捐款 | 您的支持将帮助我们持续改进和维护这个工具,为更多用户提供优质的MySQL到OceanBase迁移体验。