一个功能完整的MySQL到Oracle数据库迁移工具,支持表结构迁移、数据迁移、增量同步、断点续传和数据验证。
- ✅ 自动转换表结构(字段类型、长度、默认值、NULL约束)
- ✅ 索引迁移(普通索引、唯一索引)
- ✅ 主键约束迁移
- ✅ 外键约束迁移
- ✅ 自增序列转换(MySQL AUTO_INCREMENT → Oracle SEQUENCE + TRIGGER)
⚠️ 触发器迁移(需手动审查)
- ✅ 批量数据迁移(默认每批5000条)
- ✅ 数据类型自动转换
- ✅ 空字符串与NULL的处理(MySQL空串 → Oracle NULL)
- ✅ 日期时间类型转换
- ✅ 大文本和二进制数据迁移
- ✅ 迁移进度实时保存
- ✅ 支持暂停和恢复
- ✅ 记录每个表的迁移偏移量
- ✅ 失败自动重试
- ✅ 记录MySQL和Oracle的主键映射关系
- ✅ 支持后续的关联查询和数据追溯
- ✅ 行数对比验证
- ✅ 抽样数据验证(随机抽取1000条对比)
- ✅ 生成验证报告
- ✅ 现代化的Vue3 + Element Plus界面
- ✅ 连接测试功能
- ✅ 可视化迁移向导
- ✅ 实时进度监控
- ✅ 任务管理和历史记录
- 框架: Spring Boot 3.2 + Java 17
- 架构: COLA 4.0(Clean Architecture)
- 数据访问: MyBatis Plus
- 连接池: HikariCP
- 本地存储: H2数据库(存储任务状态和映射关系)
- 框架: Vue 3 + Vite
- UI组件: Element Plus
- 状态管理: Pinia
- HTTP客户端: Axios
data-migration/
├── migration-client/ # 对外API定义(DTO)
├── migration-adapter/ # 适配层(Web控制器)
├── migration-app/ # 应用层(业务逻辑)
│ ├── executor/ # 迁移执行器
│ ├── validator/ # 数据验证器
│ └── service/ # 应用服务
├── migration-domain/ # 领域层(领域模型)
│ ├── model/ # 领域模型
│ └── gateway/ # 领域网关接口
├── migration-infrastructure/ # 基础设施层
│ ├── datasource/ # 数据源管理
│ ├── converter/ # DDL/数据转换器
│ ├── metadata/ # 元数据读取
│ └── repository/ # 仓储实现
├── migration-start/ # 启动模块
└── migration-web/ # 前端项目
- JDK 17+
- Maven 3.8+
- Node.js 16+
- MySQL 5.7+ / 8.0+
- Oracle 11g+ / 19c+
git clone <repository-url>
cd data_migration# 编译项目
mvn clean package -DskipTests
# 启动应用
cd migration-start
mvn spring-boot:run后端服务将在 http://localhost:8080 启动
cd migration-web
# 安装依赖
npm install
# 启动开发服务器
npm run dev前端服务将在 http://localhost:3000 启动
打开浏览器访问: http://localhost:3000
-
配置源数据库(MySQL)
- 输入主机地址、端口、数据库名
- 输入用户名和密码
- 点击"测试连接"确认连接正常
-
配置目标数据库(Oracle)
- 输入主机地址、端口、服务名/SID
- 输入用户名和密码
- 点击"测试连接"确认连接正常
-
配置迁移选项
- 输入任务名称
- 选择迁移类型(全量/增量)
- 选择是否迁移索引、触发器、序列
- 设置批量大小和并发数
-
确认并创建
- 检查配置信息
- 点击"创建任务"
-
执行迁移
- 在任务详情页点击"启动"
- 实时查看迁移进度
- 支持暂停和恢复
| MySQL类型 | Oracle类型 | 说明 |
|---|---|---|
| VARCHAR | VARCHAR2 | 最大4000字节 |
| TEXT/LONGTEXT | CLOB | 大文本 |
| INT | NUMBER(10) | 整数 |
| BIGINT | NUMBER(19) | 长整数 |
| DECIMAL(p,s) | NUMBER(p,s) | 精确数值 |
| DATETIME | TIMESTAMP | 日期时间 |
| BLOB | BLOB | 二进制数据 |
| AUTO_INCREMENT | SEQUENCE + TRIGGER | 自增列 |
- 空字符串: MySQL的空字符串会被转换为Oracle的NULL
- 自增列: MySQL的AUTO_INCREMENT会转换为Oracle的SEQUENCE和TRIGGER
- 日期格式: 自动转换为Oracle的TIMESTAMP格式
- 大小写: Oracle默认转换为大写,表名和字段名会自动处理
POST /api/v1/migration/connections/test
Content-Type: application/json
{
"type": "MYSQL",
"host": "localhost",
"port": 3306,
"database": "test_db",
"username": "root",
"password": "password"
}
POST /api/v1/migration/tasks
Content-Type: application/json
{
"taskName": "测试迁移",
"sourceConfig": {...},
"targetConfig": {...},
"migrationType": "FULL",
"migrateIndexes": true,
"migrateSequences": true,
"batchSize": 5000
}
POST /api/v1/migration/tasks/{taskId}/start
GET /api/v1/migration/tasks/{taskId}/progress
server:
port: 8080
migration:
datasource:
maximum-pool-size: 10 # 连接池最大连接数
connection-timeout: 30000 # 连接超时(毫秒)
batch-size: 5000 # 默认批量大小
max-retry: 3 # 失败重试次数- 数据备份: 强烈建议在迁移前备份源数据库和目标数据库
- 权限检查: 确保源数据库有读权限,目标数据库有完整的DDL和DML权限
- 网络连接: 确保应用服务器能够同时访问MySQL和Oracle
- 磁盘空间: 确保目标数据库有足够的磁盘空间
- 批量大小: 根据数据特点调整批量大小(1000-10000)
- 并发数: 谨慎使用并发迁移,避免数据库压力过大
- 索引: 可以先迁移数据,再创建索引,提高迁移速度
- 日志级别: 生产环境建议设置为INFO或WARN
- 触发器需要手动审查和调整
- 存储过程和函数不支持自动迁移
- 视图不支持自动迁移
- 不支持分区表的自动迁移
- 检查网络连通性
- 确认数据库服务正常运行
- 检查用户名、密码和权限
- 查看错误日志
- 检查目标数据库磁盘空间
- 确认目标数据库权限
- 使用数据验证功能检查
- 检查迁移日志中的警告信息
- 手动对比关键数据
mvn clean packagemvn test- 遵循阿里巴巴Java开发规范
- 使用Lombok简化代码
- 为公共API编写JavaDoc
本项目采用 MIT 许可证
caojianmiao
- ✨ 首次发布
- ✅ 完整的MySQL到Oracle迁移功能
- ✅ Web管理界面
- ✅ 断点续传支持
- ✅ 数据验证功能