MySQL到达梦数据库快速替换操作指南
当前国产化 IT 基础设施替代已成为金融、政务、企业级业务的核心趋势。MySQL 作为开源数据库的标杆,凭借轻量、易用特性广泛应用于用户中心、订单系统、日志存储等场景,但在关键业务中,其开源协议合规性、国产化安全认证等需求难以满足。达梦数据库(DM8)作为国产数据库领军产品,不仅兼容 MySQL 语法与数据类型,还具备国密算法支持、等保三级认证等核心优势,成为 MySQL 替换的首选方案。然而,研发团队在迁移过程中常面临 “业务中断时长可控”“数据零丢失”“功能兼容性达标” 三大痛点。
本文从技术研发视角,整合达梦自动化迁移工具(DM DTS、DMDRS)实操经验,以 “快速替换” 为核心,梳理 “前置准备 - 核心实施 - 上线保障” 全流程框架,附避坑要点与 SQL 示例,助力团队 48 小时内完成中小规模集群迁移,72 小时内实现大规模集群平稳过渡。
一、前置准备:24 小时完成迁移评估与环境就绪
(一)迁移评估:精准定位兼容风险(8 小时内)
核心目标:用达梦工具扫描 MySQL 源库,输出 “兼容性问题清单 + 工作量评估表”,避免迁移中反复踩坑。
- 自动化工具扫描(首选 DM DTS)
下载达梦数据迁移工具(DM DTS V8),按以下步骤操作:
- 新建 “MySQL→DM8” 迁移项目,输入 MySQL 地址(默认 3306 端口)、用户名(需授予SELECT+REPLICATION CLIENT权限),目标库 DM8 地址(默认 5236 端口);
- 勾选 “全库扫描”,开启 “兼容性检测” 功能,工具会自动识别三大类问题:
▶ 语法兼容:MySQL 特有LIMIT分页(达梦需用ROWNUM)、GROUP BY非聚合列(达梦默认不允许,需调整参数);
▶ 数据类型:MySQLDATETIME(6)(达梦DATETIME(6)兼容,但需注意时区)、ENUM类型(达梦建议转为VARCHAR或CHAR);
▶ 函数差异:MySQLDATE_FORMAT()(达梦用TO_CHAR())、CONCAT_WS()(达梦直接用CONCAT+||拼接)。
- 输出报告:工具生成《MySQL-DM8 兼容性评估报告》,标注 “高危”“中危”“低危” 问题,例如 “存储过程中使用DELIMITER分隔符(高危,达梦无需该语法)”。
- 关键信息核查清单(研发必看)
| 核查类别 | 核心核查项 | 快速处理方案 | 避坑要点 |
|----------|------------|--------------|----------|
| 环境层 | MySQL 与 DM8 端口冲突(MySQL 3306/DM8 5236)、服务器内存分配 | 1. 确认 DM8 服务器内存≥MySQL 的 1.2 倍(达梦缓存机制更依赖物理内存);2. 关闭服务器防火墙或开放 5236 端口 | 避免将 DM8 部署在 MySQL 同一台服务器(易因资源抢占导致迁移中断) |
| 业务层 | 峰值并发量(如秒杀场景 1000QPS)、停机窗口(≤4 小时建议增量同步) | 1. 并发>500QPS 时,提前配置 DM8 连接池(MAX_SESSIONS=2000);2. 停机窗口<2 小时,直接用 “全量 + 增量” 混合迁移 | 需和业务方确认 “非核心业务可临时降级”(如日志写入暂停 1 小时) |
| 数据层 | 大表(>500 万行,如order_history)、大字段(TEXT/JSON,如user_profile) | 1. 标记大表为 “分批迁移” 对象;2. MySQLJSON字段建议迁移为 DM8JSON类型(而非VARCHAR) | 避免大字段和普通字段混迁(易导致迁移超时,建议单独创建迁移任务) |
(二)DM8 环境搭建:极简配置(16 小时内)
研发团队无需深入 DM8 内核,按 “部署 - 兼容配置 - 权限准备” 三步走:
- 极简部署(以 Linux CentOS 7 为例)
- 下载 DM8 安装包(官网获取),执行命令:./DMInstall.bin -i(命令行模式),选择 “典型安装”,默认路径/dm8;
- 启动 DM8 服务:systemctl start DmServiceDMSERVER,验证是否启动:ps -ef | grep dmserver(出现 “dmserver” 进程即成功)。
- MySQL 兼容配置(关键!避免语法改造)
登录 DM8 管理工具(disql),执行以下 SQL 开启 MySQL 兼容模式:
-- 切换到SYSDBA用户(默认密码SYSDBA) CONNECT SYSDBA/SYSDBA@localhost:5236; -- 开启MySQL兼容模式(COMPATIBLE_MODE=4表示兼容MySQL) SP_SET_PARA_VALUE(1, 'COMPATIBLE_MODE', 4); -- 允许GROUP BY非聚合列(和MySQL行为一致) SP_SET_PARA_VALUE(1, 'SQL_MODE', 0); -- 重启DM8使配置生效(生产环境建议业务低峰期执行) SHUTDOWN IMMEDIATE; STARTUP; |
- 权限准备(研发需创建迁移专用用户)
-- 创建迁移用户dm_migrate,密码加密存储 CREATE USER dm_migrate IDENTIFIED BY "Dm@123456" ENCRYPTED; -- 授予目标库表创建、数据插入权限 GRANT RESOURCE, DBA TO dm_migrate; -- 授予MySQL源库读取权限(通过DM DTS连接时使用) GRANT SELECT ANY TABLE, REPLICATION CLIENT ON *.* TO 'mysql_migrate'@'%' IDENTIFIED BY 'Mysql@123456'; |
二、核心实施:按数据量分级迁移(最快 4 小时完成)
(一)小数据量(<100GB):全量迁移(4 小时内)
适合场景:用户中心、配置表等中小规模业务,停机窗口≤4 小时。
- DM DTS 全量迁移步骤
- 打开 DM DTS,在已创建的迁移项目中,勾选 “需要迁移的对象”(表、视图、存储过程),注意:
▶ 视图迁移:MySQL 视图中LIMIT需手动改为ROWNUM(工具暂不自动转换);
▶ 存储过程迁移:删除 MySQL 特有的DELIMITER $$分隔符,达梦默认用;分隔。
- 选择 “数据迁移方式” 为 “全量迁移”,勾选 “迁移后自动创建索引”(避免后续手动重建);
- 点击 “开始迁移”,工具会实时显示进度(如 “表 t_user 迁移完成,共 100 万行,耗时 15 分钟”)。
- 研发必做的校验步骤(1 小时内)
迁移完成后,需验证 “表结构一致 + 数据一致 + 功能可用”:
-- 1. 表数量一致性校验(源库MySQL vs 目标库DM8) -- MySQL端执行 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mysql_db'; -- DM8端执行 SELECT COUNT(*) FROM ALL_TABLES WHERE OWNER = 'DM_MIGRATE'; -- 2. 核心表数据一致性校验(以用户表t_user为例) -- 比对总行数 SELECT COUNT(*) FROM mysql_db.t_user; -- MySQL端 SELECT COUNT(*) FROM dm_migrate.t_user; -- DM8端 -- 比对关键字段求和(避免数据丢失) SELECT SUM(id) FROM mysql_db.t_user; -- MySQL端 SELECT SUM(id) FROM dm_migrate.t_user; -- DM8端 -- 3. 功能校验(执行核心SQL,如用户登录查询) -- MySQL端 SELECT id, username, password FROM mysql_db.t_user WHERE username = 'test' LIMIT 1; -- DM8端(兼容模式下可直接用LIMIT,也可写标准语法) SELECT id, username, password FROM dm_migrate.t_user WHERE username = 'test' LIMIT 1; -- 或标准语法:SELECT * FROM (SELECT id, username, password FROM dm_migrate.t_user WHERE username = 'test') WHERE ROWNUM = 1; |
(二)大数据量(≥100GB):全量 + 增量同步(8 小时内)
适合场景:订单表、交易日志等大规模业务,停机窗口<2 小时(仅需切换连接串时间)。
- 混合迁移流程(DM DTS+DMDRS 组合)

- 步骤 1:MySQL 开启 binlog(必须!增量同步依赖)
修改 MySQL 配置文件my.cnf:
log_bin = mysql-bin # 开启binlog binlog_format = ROW # 行级格式(DMDRS仅支持该格式) server_id = 1 # 唯一标识(避免和其他实例冲突) |
重启 MySQL:systemctl restart mysqld,验证:show variables like 'log_bin';(值为 ON 即成功)。
- 步骤 2:DMDRS 配置增量同步
下载达梦数据实时同步工具(DMDRS),新建 “MySQL→DM8” 同步任务:
- 源库配置:输入 MySQL 地址、binlog 文件路径(如/var/lib/mysql/mysql-bin.000001);
- 目标库配置:输入 DM8 地址、同步用户(dm_migrate);
- 启动同步:DMDRS 会自动捕获 MySQL 新增 / 修改 / 删除操作,实时同步至 DM8,延迟≤1 秒。
- 避坑要点:大表分批迁移
对于>1000 万行的大表(如order_history),直接全量迁移易超时,研发可按 “分表迁移” 优化:
-- MySQL端:按时间分批次导出数据(示例:导出2024年1月数据) SELECT * FROM mysql_db.order_history WHERE create_time BETWEEN '2024-01-01' AND '2024-01-31' INTO OUTFILE '/tmp/order_202401.csv' FIELDS TERMINATED BY ','; -- DM8端:批量导入CSV文件(用disql执行) LOAD DATA INFILE '/tmp/order_202401.csv' INTO TABLE dm_migrate.order_history FIELDS TERMINATED BY ','; |
分批完成后,用 DMDRS 同步 “2024 年 2 月至今” 的增量数据,避免全量迁移耗时过长。
三、上线保障:72 小时平稳过渡(研发主导 + 业务协同)
(一)双轨运行验证(48 小时)
核心目标:让应用同时读写 MySQL 和 DM8,验证 DM8 功能与性能达标,避免直接割接风险。
- 研发改造:应用层支持双数据源
以 Spring Boot 应用为例,通过配置中心实现双数据源切换:
# 配置文件新增DM8数据源 spring: datasource: mysql: # 原MySQL数据源 url: jdbc:mysql://localhost:3306/mysql_db username: mysql_user password: Mysql@123456 dm8: # 新DM8数据源 url: jdbc:dm://localhost:5236/dm_db?compatibleMode=mysql # 开启MySQL兼容 username: dm_migrate password: Dm@123456 # 新增数据源切换开关(配置中心动态调整) feature: datasource: main: mysql # 主数据源(默认MySQL) read: dm8 # 读数据源(灰度切流读请求至DM8) |
改造 DAO 层,读请求(如 “查询用户信息”)走 DM8,写请求(如 “创建订单”)走 MySQL,对比两者返回结果一致性。
- 性能验证:流量回放测试
用 JMeter 录制 MySQL 生产环境的核心接口流量(如 “用户登录”“订单提交”),在 DM8 环境回放,需满足:
- 响应时间:DM8 接口延迟≤MySQL 的 110%(如 MySQL 平均 50ms,DM8≤55ms);
- 错误率:核心接口(支付、登录)错误率 = 0;
- 并发支撑:模拟 1000QPS 压力,DM8 CPU 使用率≤70%,内存使用率≤80%。
(二)割接与回滚(<2 小时)
研发需提前制定 “割接步骤清单”,联合运维、业务团队同步执行:
- 快速割接步骤(按顺序执行)
步骤 | 操作内容 | 责任人 | 耗时 |
1 | 通知业务方:进入 “割接窗口期”(建议凌晨 2-4 点),非核心业务暂停 | 业务负责人 | 10 分钟 |
2 | 暂停应用写操作:禁止 MySQL 新增 / 修改数据(如关闭订单提交接口) | 研发 | 5 分钟 |
3 | 等待 DMDRS 增量同步完成:DMDRS 控制台显示 “同步延迟 = 0” | 研发 | 15 分钟 |
4 | 最终数据校验:核心表(如user、order)数据一致性 100% | 研发 | 20 分钟 |
5 | 切换数据源:配置中心将主数据源改为 DM8,重启应用(或动态刷新) | 研发 | 10 分钟 |
6 | 验证业务:打开核心功能(登录、下单),确认正常使用 | 业务测试 | 20 分钟 |
7 | 监控 DM8:观察 CPU、内存、IO 使用率,无异常则完成割接 | 运维 | 25 分钟 |
- 应急回滚预案(研发必测)
若割接后出现业务异常(如接口报错、数据不一致),10 分钟内完成回滚:
- 步骤 1:配置中心切换主数据源回 MySQL,重启应用;
- 步骤 2:停止 DMDRS 同步,保留 MySQL binlog 文件(用于后续排查问题);
- 步骤 3:业务恢复后,研发排查 DM8 异常原因(如语法兼容、索引缺失),优化后重新割接。
四、研发避坑指南:常见问题速解
问题现象 | 根因分析 | 解决方案 |
DM8 执行LIMIT报错:“无效的 SQL 语句” | 未开启 MySQL 兼容模式(COMPATIBLE_MODE≠4) | 执行SP_SET_PARA_VALUE(1, 'COMPATIBLE_MODE', 4),重启 DM8 |
迁移后自增主键不连续(如 MySQL 自增到 1000,DM8 从 1 开始) | DM8 未继承 MySQL 自增主键当前值 | 迁移后执行:ALTER TABLE dm_migrate.t_user MODIFY COLUMN id INT IDENTITY(1001,1);(从 1001 开始自增) |
读取 JSON 字段报错:“数据类型不匹配” | MySQLJSON字段迁移为 DM8VARCHAR,而非JSON类型 | 重新迁移:将 MySQLJSON映射为 DM8JSON类型,查询用JSON_VALUE函数(如SELECT JSON_VALUE(user_profile, '$.name') FROM t_user;) |
迁移后查询变慢:大表查询耗时翻倍 | DM8 未创建索引,或统计信息过时 | 1. 重建索引:CREATE INDEX idx_order_create_time ON dm_migrate.order(create_time);;2. 更新统计信息:ANALYZE TABLE dm_migrate.order COMPUTE STATISTICS; |
五、上线后优化(24 小时内)
(一)性能调优(研发可操作)
针对 DM8 特性,调整关键参数提升性能:
-- 1. 提升并发连接能力(默认100,改为2000) SP_SET_PARA_VALUE(1, 'MAX_SESSIONS', 2000); -- 2. 增大缓存区(内存16GB服务器,设为8GB) SP_SET_PARA_VALUE(1, 'BUFFER_POOL_SIZE', 8589934592); -- 3. 优化日志写入(减少IO,适合高写场景) SP_SET_PARA_VALUE(1, 'LOG_BUFFER_SIZE', 104857600); -- 4. 开启并行查询(大表查询速度提升2-3倍) ALTER SYSTEM SET MAX_PARALLEL_DEGREE = 8; |
(二)合规加固(满足国产化要求)
研发需配合运维完成等保合规配置:
- 启用国密算法:SP_SET_PARA_VALUE(1, 'ENABLE_SM4', 1);(加密数据传输);
- 审计日志:创建审计用户,记录所有数据操作(CREATE AUDIT POLICY audit_all ON ALL TABLES FOR ALL USERS;);
- 权限最小化:回收迁移用户 dm_migrate 的 DBA 权限,仅保留SELECT+INSERT+UPDATE权限。
结语
MySQL 替换为达梦数据库的核心是 “工具赋能 + 风险可控”:通过 DM DTS、DMDRS 自动化工具减少手动操作,缩短迁移周期;通过 “双轨运行 + 应急回滚” 降低业务风险。研发团队无需从零学习 DM8 内核,只需聚焦 “兼容性改造”“数据校验”“性能优化” 三个核心环节,即可快速完成替换。
后续可进一步探索 DM8 的高级特性,如分区表(替代 MySQL 分表)、读写分离(提升并发)、时序引擎(存储监控日志),充分发挥国产数据库的性能优势。
(注:文档部分内容由 AI 生成)
