将MySQL数据库迁移到达梦数据库(DMDB)的完整指南
迁移MySQL数据库到达梦数据库需要系统性的步骤和工具支持。以下是详细的迁移方案:
一、迁移前的准备工作
1. 环境检查
- 确认源MySQL数据库版本
- 确认目标达梦数据库版本(建议使用DM8)
- 确保网络连通性
- 准备足够的存储空间
2. 工具准备
- 达梦数据库迁移工具(DTS):达梦官方提供的图形化迁移工具
- DM Database Link:用于异构数据库间数据传输
- 第三方工具:如Kettle(Pentaho Data Integration)
二、使用达梦DTS工具迁移(推荐)
1. 安装和配置DTS
- 从达梦官网下载DTS工具
- 安装在与达梦数据库网络连通的机器上
- 确保能同时访问MySQL和达梦数据库
2. 迁移步骤
-
创建迁移项目
- 打开DTS工具
- 新建迁移项目,选择"MySQL到达梦"迁移类型
-
配置源数据库(MYSQL)
数据库类型:MySQL 主机名:MySQL服务器IP 端口:3306 用户名:有权限的账号 密码:对应密码 数据库名:要迁移的数据库
-
配置目标数据库(DM)
数据库类型:DM 主机名:达梦服务器IP 端口:5236(默认) 用户名:SYSDBA(或其他有权限账号) 密码:对应密码 数据库名:目标数据库(需预先创建)
-
选择迁移对象
- 全选所有表
- 可选择迁移表结构、数据、索引、约束等
- 高级选项中可设置字符集转换(通常UTF8→UTF-8或GB18030)
-
数据类型映射配置
- 检查自动映射结果,特别是:
- MySQL的DATETIME→DM的TIMESTAMP
- MySQL的TINYINT→DM的SMALLINT
- MySQL的TEXT→DM的CLOB
- 检查自动映射结果,特别是:
-
执行迁移
- 先执行"预迁移"检查问题
- 解决所有警告和错误后执行完整迁移
- 大型数据库可分批次迁移
三、使用命令行工具迁移
1. 使用dmfldr(达梦高速数据加载器)
-
从MySQL导出数据为CSV:
mysql -u username -p -e "SELECT * FROM table" database > table.csv
-
创建达梦控制文件(table.ctl):
LOAD DATA INFILE 'table.csv' INTO TABLE target_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
-
使用dmfldr导入:
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=table.ctl
2. 使用数据库链接(DM Database Link)
-
在达梦数据库中创建到MySQL的链接:
CREATE PUBLIC LINK MYSQL_LINK CONNECT TO mysql_user IDENTIFIED BY 'password' USING 'jdbc:mysql://mysql_host:3306/dbname';
-
使用INSERT…SELECT迁移数据:
INSERT INTO dm_table SELECT * FROM mysql_table@MYSQL_LINK;
四、迁移后的校验工作
1. 数据一致性检查
-
记录计数比对:
-- MySQL SELECT COUNT(*) FROM mysql_table; -- 达梦 SELECT COUNT(*) FROM dm_table;
-
抽样数据比对:
-- 在两边执行相同查询比对结果 SELECT * FROM table WHERE id BETWEEN 100 AND 200;
2. 应用程序适配修改
-
SQL语法调整:
- LIMIT → ROWNUM/TOP
- 日期函数差异
- 字符串处理函数差异
-
JDBC连接配置修改:
# 原MySQL配置 spring.datasource.url=jdbc:mysql://localhost:3306/db spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 修改为达梦配置 spring.datasource.url=jdbc:dm://localhost:5236/DB spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
五、常见问题解决方案
1. 字符集问题
- 现象:中文乱码
- 解决方案:
- 确保达梦数据库使用GB18030或UTF-8字符集
- 在迁移工具中正确设置字符集转换
2. 数据类型不兼容
- 现象:某些字段迁移失败
- 解决方案:
- 修改目标表结构适应源数据类型
- 使用CAST或CONVERT函数转换数据
3. 自增列问题
- 现象:自增ID不连续
- 解决方案:
- 迁移后重置达梦序列:
ALTER TABLE table_name ALTER COLUMN id RESTART WITH new_value;
- 迁移后重置达梦序列:
4. 大表迁移超时
- 解决方案:
- 分批迁移数据
- 增加超时设置
- 使用dmfldr工具直接导入
六、性能优化建议
-
迁移前:
- 在达梦数据库中适当增大BUFFER参数
- 关闭事务自动提交
-
迁移中:
- 对大表禁用索引和约束,迁移后重建
- 使用并行迁移提高速度
-
迁移后:
- 执行统计信息收集:
CALL SP_TAB_STAT_INIT('SYSDBA', 'TABLE_NAME');
- 检查执行计划
- 执行统计信息收集:
七、自动化迁移脚本示例
#!/bin/bash
# MySQL到达梦自动化迁移脚本示例
# 1. 从MySQL导出结构
mysqldump -u root -p --no-data dbname > schema.sql
# 2. 转换SQL语法(简化示例)
sed -i 's/ENGINE=InnoDB//g' schema.sql
sed -i 's/COMMENT.*,$/,/g' schema.sql
# 3. 在达梦中创建结构
disql SYSDBA/SYSDBA@localhost:5236 `schema.sql`
# 4. 使用dmfldr迁移每张表数据
for table in $(mysql -u root -p -e "SHOW TABLES" dbname)
do
# 导出数据
mysql -u root -p -e "SELECT * FROM $table" dbname > $table.csv
# 创建控制文件
echo "LOAD DATA INFILE '$table.csv' INTO TABLE $table" > $table.ctl
# 导入数据
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=$table.ctl
done
通过以上系统化的方法,您可以高效地将MySQL数据库完整迁移到达梦数据库。对于特别复杂的迁移场景,建议联系达梦官方技术支持获取针对性帮助。