# 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迁移体验。