1. MySQL到达梦数据库迁移实战指南
最近在项目中完成了从MySQL到达梦数据库(DM8)的迁移工作,整个过程踩了不少坑,也积累了一些经验。达梦作为国产数据库的代表之一,在语法和功能上与MySQL存在不少差异,直接迁移往往会遇到各种问题。本文将详细记录迁移过程中的关键步骤、常见问题及解决方案,希望能帮助有类似需求的同行少走弯路。
2. 迁移前的准备工作
2.1 达梦数据库安装与配置
首先需要从达梦官网下载DM8开发版,安装过程相对简单:
- 访问达梦官网产品下载页面,选择适合的版本
- 下载完成后运行安装程序,按向导完成安装
- 安装完成后,在开始菜单中找到"DM管理工具"
注意:生产环境建议使用企业版,开发版仅用于测试和评估。安装时需注意选择与MySQL相同或兼容的字符集,避免后续字符转换问题。
2.2 创建迁移工程
在DM管理工具中创建迁移工程的步骤:
- 右击空白处选择"新建工程"
- 输入工程名称和保存路径
- 在工程中右键选择"新建迁移"
迁移工程创建后,建议立即设置工程字符集为UTF-8,与MySQL保持一致。这可以通过工程属性中的"字符集设置"选项完成。
3. 数据库迁移详细步骤
3.1 配置数据源连接
3.1.1 MySQL源库配置
- 在迁移向导中选择"MySQL到DM"迁移方式
- 输入MySQL连接信息:
- 主机名/IP地址
- 端口号(默认3306)
- 用户名和密码
- 要迁移的数据库名称
- 点击"测试连接"确保配置正确
- 点击"刷新"按钮加载数据库列表
3.1.2 达梦目标库配置
- 输入达梦数据库连接信息:
- 主机名/IP地址
- 端口号(默认5236)
- 用户名和密码
- 目标模式名称
- 同样需要测试连接确保配置正确
重要提示:达梦默认使用SYSDBA作为超级用户,生产环境应创建专用用户并分配适当权限。
3.2 迁移选项设置
在迁移选项步骤中,有几个关键设置需要注意:
- 对象名大小写:达梦默认将表名和字段名转换为大写,如果不希望转换,需要勾选"保持对象名大小写"选项
- 字符集转换:确保源和目标字符集设置正确,通常都选择UTF-8
- 数据类型映射:检查自动生成的数据类型映射关系,特别是:
- MySQL的VARCHAR到达梦的VARCHAR2
- MySQL的DATETIME到达梦的TIMESTAMP
- MySQL的TINYINT到达梦的SMALLINT
3.3 选择迁移对象
- 在"指定对象"步骤中,可以全选所有表或按需选择
- 对于大型数据库,建议分批迁移,先迁移表结构,再迁移数据
- 特别注意包含自增字段的表,可能需要特殊处理
3.4 执行迁移
- 在"审阅任务"步骤检查所有配置
- 点击"完成"开始迁移
- 迁移过程中可以查看实时日志
- 迁移完成后,验证迁移报告中的错误和警告
4. 常见问题与解决方案
4.1 SQL语法差异问题
4.1.1 关键字和保留字处理
达梦有一系列关键字和保留字,不能直接作为列名使用。常见问题包括:
-
关键字冲突:如USER、DOMAIN、LESS等
- 解决方案:在SQL中用双引号包裹这些关键字,如"user"
-
系统保留字:ROWID、TRXID等不能作为列名,即使加引号也不行
- 解决方案:必须修改列名
4.1.2 数据类型差异
-
字符类型长度:
- MySQL的varchar(1)可存1个汉字(UTF8)
- 达梦需要varchar(3)才能存1个UTF8汉字
- 解决方案:迁移后检查并调整字段长度
-
布尔值表示:
- MySQL使用TRUE/FALSE
- 达梦使用1/0
- 解决方案:将代码中的布尔值替换为数字
4.1.3 函数差异
-
日期函数:
sql复制-- MySQL DATE_FORMAT(a.expiry_date, '%Y-%m-%d %H:%M:%S') -- 达梦 TO_CHAR(a.expiry_date, 'YYYY-MM-DD HH24:MI:SS') -
日期运算:
sql复制-- MySQL NOW() - INTERVAL 24 HOUR -- 达梦 DATE_SUB(NOW(), INTERVAL '24' HOUR) -
字符串排序:
sql复制-- MySQL CONVERT(e.expert_name USING gbk) -- 达梦 NLSSORT(e.expert_name,'NLS_SORT = SCHINESE_PINYIN_M')
4.2 应用程序适配修改
4.2.1 JDBC连接配置
-
添加达梦JDBC驱动依赖:
xml复制<dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>8.1.2.79</version> </dependency> -
修改数据库连接配置:
properties复制# MySQL配置 # jdbc.url=jdbc:mysql://localhost:3306/dbname # jdbc.driver=com.mysql.jdbc.Driver # 达梦配置 jdbc.url=jdbc:dm://localhost:5236/DBNAME jdbc.driver=dm.jdbc.driver.DmDriver
4.2.2 逻辑删除字段处理
MySQL中常见的逻辑删除字段在达梦中需要调整:
-
修改常量定义:
java复制// MySQL风格 public static final boolean DEL_FLAG_NORMAL = false; public static final boolean DEL_FLAG_DELETE = true; // 达梦适配 public static final int DEL_FLAG_NORMAL = 0; public static final int DEL_FLAG_DELETE = 1; -
修改XML中的条件:
xml复制<!-- 修改前 --> <if test="delFlag != null and delFlag != ''"> and del_flag = #{delFlag} </if> <!-- 修改后 --> <if test="delFlag != null"> and del_flag = #{delFlag} </if>
4.2.3 元数据查询差异
查询数据库表结构时,达梦与MySQL的系统表不同:
sql复制-- MySQL查询列信息
SELECT column_name, data_type FROM information_schema.columns
WHERE table_schema = 'dbname' AND table_name = 'tablename'
-- 达梦等效查询
SELECT COLUMN_NAME, DATA_TYPE FROM DBA_TAB_COLUMNS
WHERE OWNER = 'USERNAME' AND TABLE_NAME = 'TABLENAME'
4.3 性能与兼容性优化
-
索引调整:
- 达梦的索引实现与MySQL不同
- 迁移后需要重新评估索引策略
- 考虑添加达梦特有的位图索引等
-
事务处理:
- 达梦默认使用隐式事务
- 确保应用中的事务控制逻辑仍然有效
-
存储过程重写:
- 语法差异较大,需要逐条检查
- 特别注意异常处理部分的差异
5. 迁移后的验证与测试
5.1 数据一致性检查
-
使用达梦提供的校验工具对比源库和目标库
-
对关键表进行抽样检查:
- 记录总数是否一致
- 关键字段值是否相同
- 特殊字符是否正常迁移
-
检查自增字段的当前值:
sql复制-- 达梦查询自增当前值 SELECT IDENT_CURRENT('SCHEMA.TABLENAME')
5.2 应用功能测试
- 基础CRUD操作测试
- 复杂查询验证
- 事务处理测试
- 性能基准测试
5.3 常见问题排查
-
字符显示异常:
- 检查客户端和服务端的NLS_LANG设置
- 确认迁移过程中字符集转换正确
-
性能下降:
- 检查执行计划
- 优化达梦特有的参数配置
-
应用报错:
- 检查日志中的完整SQL
- 在达梦环境中单独执行定位问题
6. 经验总结与建议
在实际迁移过程中,我总结了以下几点经验:
-
前期评估很重要:充分了解两个数据库的差异,评估迁移工作量
-
分阶段迁移:先结构后数据,先核心表后辅助表
-
自动化脚本:编写SQL转换脚本处理常见语法差异
-
充分测试:建立完整的测试用例,覆盖所有业务场景
-
回退方案:准备完善的回退计划,特别是生产环境迁移
达梦数据库作为国产数据库的优秀代表,在功能上已经相当完善。虽然与MySQL存在一些差异,但通过合理的迁移规划和适配工作,完全可以实现平滑过渡。迁移过程中最关键的还是充分理解两种数据库的差异,有针对性地进行调整。