从 MySQL 迁移到达梦数据库(DM8)
前言
达梦数据库(DM8)作为主流国产关系型数据库,兼容 MySQL 协议和大部分语法,是信创场景下 MySQL 迁移的核心选择。本文从迁移前准备、环境搭建、数据迁移、应用适配、验证优化五个阶段,详细讲解 。
一、迁移前准备:评估与规划
1. 环境与版本确认
| 核对项 | 要求 / 说明 |
|---|---|
| MySQL 版本 | 支持 5.5/5.6/5.7/8.0 版本(8.0 部分新语法需单独适配) |
| 达梦版本 | 推荐 DM8 最新版本(如 DM8 2023 版),需匹配操作系统(x86 / 鲲鹏 / 飞腾) |
| 操作系统 | 达梦支持 Linux(CentOS / 麒麟 / 统信)、Windows,需与 MySQL 部署架构一致 |
| 资源评估 | 达梦单机建议内存 ≥ 8G、CPU ≥ 4 核,数据盘空间 ≥ MySQL 数据量的 1.5 倍 |
2. 业务与数据评估
- 语法兼容性检查:达梦虽兼容 MySQL 大部分语法,但需提前排查不兼容项:
- 业务影响评估:确定迁移窗口(全量迁移建议选择低峰期),评估是否需要增量同步。
| MySQL 特性 | 达梦兼容情况 | 适配方案 |
|---|---|---|
| 存储过程 / 自定义函数 | 语法差异较大(如变量声明、游标) | 重新编写,适配达梦 PL/SQL 语法 |
| 触发器 | 触发时机 / 语法略有差异 | 重构触发器逻辑 |
| 索引类型(如 FULLTEXT) | 达梦不支持全文索引 | 替换为达梦全文检索组件或 ES 辅助 |
| 数据类型(如 JSON) | DM8 支持 JSON 类型,但函数略有差异 | 替换为达梦 JSON 函数(如 JSON_GET → JSON_VALUE) |
注释符(#) | 达梦仅支持 --//* */ | 批量替换注释符 |
数据量统计:通过 information_schema 统计 MySQL 库表大小、行数,确定迁移时长:
-- MySQL 统计各库数据量 SELECT TABLE_SCHEMA 数据库名, SUM(DATA_LENGTH + INDEX_LENGTH)/1024/1024 总大小(MB), COUNT(TABLE_NAME) 表数量 FROM information_schema.TABLES GROUP BY TABLE_SCHEMA;3. 工具准备
| 工具名称 | 用途 | 获取方式 |
|---|---|---|
| 达梦数据迁移工具(DTS) | 全量数据迁移(官方推荐) | 达梦安装包自带(dmdbms/tool/dts) |
| DMHS | 增量数据同步(MySQL → 达梦) | 达梦官方提供(需单独申请授权) |
| Navicat/DBeaver | 语法校验、数据验证 | 适配达梦的版本(需安装达梦驱动) |
| MySQL dump | 应急备份(可选) | MySQL 自带 |
二、环境搭建:达梦数据库部署与配置
1. 达梦数据库安装(Linux 示例)
步骤 1:依赖安装
# CentOS 系统 yum install -y libaio-devel numactl-devel # 麒麟/统信系统 apt install -y libaio-dev numactl步骤 2:创建用户与目录
# 创建达梦用户 useradd -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba # 创建数据/日志目录 mkdir -p /dm8/data /dm8/log chown -R dmdba:dmdba /dm8步骤 3:安装达梦
# 切换到达梦用户 su - dmdba # 执行安装包(以鲲鹏版本为例) ./dm8_setup.bin -i # 安装向导选择: # 1. 语言:中文 # 2. 安装类型:典型安装 # 3. 安装路径:/dm8 # 4. 确认安装,等待完成步骤 4:初始化实例
# 进入达梦工具目录 cd /dm8/bin # 初始化实例(适配 MySQL 字符集,建议 UTF-8) ./dminit PATH=/dm8/data DB_NAME=DMDB INSTANCE_NAME=DMSERVER PORT_NUM=5236 CHARSET=1 # 说明:CHARSET=1 代表 UTF-8,PORT_NUM 可自定义(默认 5236)步骤 5:启动达梦服务
# 注册服务 /dm8/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DMDB/dm.ini -p DMSERVER # 启动服务 systemctl start DmServiceDMSERVER # 查看状态 systemctl status DmServiceDMSERVER2. 达梦兼容 MySQL 配置
修改达梦配置文件 dm.ini,开启 MySQL 协议兼容:
# 打开 dm.ini(路径:/dm8/data/DMDB/dm.ini) vi /dm8/data/DMDB/dm.ini # 修改以下参数 INSTANCE_NAME = DMSERVER PORT_NUM = 5236 # 达梦端口 MYSQL_PORT = 3306 # 兼容 MySQL 协议的端口(模拟 MySQL 端口) CHARSET = 1 # UTF-8 字符集 COMPATIBLE_MODE = 4 # 4=兼容 MySQL,0=达梦原生模式 SQL_COMPATIBLE = 'MYSQL' # SQL 语法兼容 MySQL修改后重启达梦服务:
systemctl restart DmServiceDMSERVER三、全量数据迁移:使用达梦 DTS 工具
达梦数据迁移工具(DTS)是官方标配的可视化迁移工具,支持结构迁移、数据迁移、增量同步,操作简单且兼容性强。
1. 启动 DTS 工具
# 切换到达梦用户 su - dmdba # 启动可视化工具(需图形化界面,或远程连接) /dm8/tool/dts若服务器无图形化界面,可通过 Windows 客户端安装达梦工具包,远程连接 MySQL 和达梦数据库。
2. 新建迁移项目
- 打开 DTS → 新建项目 → 填写项目名称(如 MySQL2DM8)→ 选择保存路径;
- 新建迁移任务 → 任务类型选择 “数据迁移”→ 下一步。
3. 配置源端(MySQL)
| 配置项 | 填写说明 |
|---|---|
| 数据库类型 | 选择 “MySQL” |
| 主机名 | MySQL 服务器 IP |
| 端口 | MySQL 端口(默认 3306) |
| 数据库名 | 需迁移的 MySQL 库名(或选 “全部”) |
| 用户名 / 密码 | MySQL 有读写权限的账号 |
| 字符集 | 选择与 MySQL 一致的字符集(如 utf8mb4) |
配置完成后点击 “测试连接”,确认连接成功。
4. 配置目标端(达梦)
| 配置项 | 填写说明 |
|---|---|
| 数据库类型 | 选择 “DM8” |
| 主机名 | 达梦服务器 IP |
| 端口 | 达梦端口(默认 5236) |
| 数据库名 | 达梦实例名(如 DMDB) |
| 用户名 / 密码 | 达梦 SYSDBA 账号(默认密码 SYSDBA) |
| 字符集 | UTF-8(与源端一致) |
测试连接成功后,下一步。
5. 选择迁移对象
- 左侧勾选需要迁移的库、表、视图等对象;
- 点击 “对象映射”,检查表名、字段名映射(达梦默认大小写不敏感,可按需调整);
- 点击 “字段映射”,校验数据类型转换(DTS 会自动映射,如 MySQL INT → 达梦 INTEGER,VARCHAR → VARCHAR2);
- 手动调整不兼容的字段类型(如 MySQL JSON → 达梦 JSON,或 VARCHAR2);
- 处理字段长度(达梦 VARCHAR2 最大 4000,超过需改为 CLOB)。
6. 配置迁移选项
| 关键配置 | 建议选择 |
|---|---|
| 迁移方式 | 全量迁移(首次迁移) |
| 存在相同表 | 选择 “清空目标表数据后迁移” 或 “覆盖目标表” |
| 批量提交行数 | 根据数据量调整(如 1000 行 / 批) |
| 迁移前预检查 | 勾选(检查语法、类型兼容性) |
| 生成迁移日志 | 勾选(便于排查问题) |
7. 执行迁移
- 点击 “完成”→ 执行任务;
- 查看迁移进度,若出现报错,根据日志提示修复(如字段类型不兼容、主键冲突等);
- 迁移完成后,查看 “迁移报告”,确认迁移成功率(100% 为最优)。
四、增量数据同步:使用 DMHS(可选)
若迁移窗口无法覆盖全量迁移(如数据量超大、业务不允许长时间停机),需通过达梦 DMHS 工具实现 MySQL 到 DM8 的增量同步,保证数据一致性。
1. DMHS 部署
- 下载 DMHS 安装包,分别部署在 MySQL 服务器(源端)和达梦服务器(目标端);
配置 MySQL 开启 binlog(必须):
# 修改 my.cnf log_bin = mysql-bin binlog_format = ROW # 行模式(DMHS 要求) server_id = 1 # 唯一 ID2. 配置 DMHS 同步任务
- 编辑源端(MySQL)配置文件
dmhs_ora.ini(适配 MySQL 需调整驱动); - 编辑目标端(达梦)配置文件
dmhs_dm.ini; - 启动 DMHS 服务,启动同步任务;
- 监控同步状态,确保增量数据实时同步。
五、应用适配:代码与配置修改
达梦兼容 MySQL 协议,大部分应用代码无需大幅修改,但需调整以下关键点:
1. 数据库连接配置
以 Java(Spring Boot)为例:
原 MySQL 配置
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver达梦配置(兼容模式)
spring: datasource: # 达梦 MySQL 兼容端口连接 url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8 username: SYSDBA password: SYSDBA driver-class-name: com.mysql.cj.jdbc.Driver # 或使用达梦原生驱动 # url: jdbc:dm://127.0.0.1:5236/DMDB?characterEncoding=utf8 # driver-class-name: dm.jdbc.driver.DmDriver2. SQL 语法适配
| MySQL 语法 / 函数 | 达梦替代方案 |
|---|---|
LIMIT m,n | ROWNUM 或 OFFSET m ROWS FETCH NEXT n ROWS ONLY |
CONCAT_WS(',', a, b) | CONCAT(a, ',', b) 或自定义函数 |
NOW() | SYSDATE 或 CURRENT_TIMESTAMP |
IFNULL(a, b) | NVL(a, b) |
JSON_EXTRACT(json_col, '$.key') | JSON_VALUE(json_col, '$.key') |
INSERT IGNORE INTO | MERGE INTO 或先查询后插入 |
3. 存储过程 / 函数重构
达梦支持 PL/SQL 语法,需将 MySQL 存储过程转换为达梦格式,示例:
MySQL 存储过程
DELIMITER // CREATE PROCEDURE get_user(IN uid INT, OUT uname VARCHAR(50)) BEGIN SELECT name INTO uname FROM user WHERE id = uid; END // DELIMITER ;达梦等价存储过程
CREATE OR REPLACE PROCEDURE get_user(uid IN INT, uname OUT VARCHAR2) AS BEGIN SELECT name INTO uname FROM user WHERE id = uid; END; /六、迁移验证与优化
1. 数据一致性验证
- 行数校验:对比 MySQL 和达梦的表行数,确保一致:
-- 达梦查询表行数 SELECT TABLE_NAME, NUM_ROWS FROM DBA_TABLES WHERE OWNER='SYSDBA'; -- MySQL 查询表行数 SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='testdb';- 抽样校验:随机抽取部分数据,对比字段值(如主键、索引字段、大字段);
- 业务校验:执行核心业务 SQL(查询、新增、修改、删除),验证结果与 MySQL 一致。
2. 性能优化
- 索引优化:达梦索引语法与 MySQL 略有差异,需重新创建合适的索引(如主键索引、联合索引);
- SQL 优化:达梦执行计划与 MySQL 不同,通过
EXPLAIN分析慢 SQL,调整索引或 SQL 结构。
参数调优:根据服务器配置调整达梦 dm.ini 参数:
MEM_POOL_SIZE = 2048 # 内存池大小(建议物理内存的 50%) BUFFER_POOL_SIZE = 4096 # 数据缓冲区大小 SORT_BUF_SIZE = 1024 # 排序缓冲区大小3. 故障回滚预案
若迁移后发现严重问题,需快速回滚:
- 停止应用写入达梦;
- 切换应用回 MySQL 数据库;
- 分析迁移问题,修复后重新执行迁移流程。
七、常见问题与解决方案
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 迁移时报 “字段长度超出限制” | 达梦 VARCHAR2 最大 4000 字节 | 将超长字段改为 CLOB 类型,或拆分字段 |
| 应用连接达梦时报 “驱动错误” | 驱动版本不匹配或 URL 格式错误 | 使用达梦官方驱动,检查 JDBC URL 格式 |
| 索引迁移失败 | MySQL 全文索引 / 空间索引达梦不支持 | 删除不兼容索引,改用达梦替代方案 |
| 存储过程执行报错 | 语法不兼容(如变量声明、游标) | 按达梦 PL/SQL 语法重构存储过程 |
| 增量同步数据延迟 | DMHS 配置不当或网络问题 | 调整 DMHS 同步频率,检查网络带宽 |
八、总结
从 MySQL 迁移到达梦数据库的核心是 “先评估、再迁移、后验证”:
- 迁移前充分评估数据量、语法兼容性、业务影响,避免踩坑;
- 优先使用达梦官方工具(DTS/DMHS),降低迁移复杂度;
- 应用适配阶段重点关注 SQL 语法、连接配置、存储过程重构;
- 迁移后必须做全量数据校验和业务测试,确保数据一致性和业务可用。

