首页 > 数据库 > 国内数据库 > MySQL 迁移到达梦实施方案及问题汇总
说明 :
仅供测试参考,实际迁移方法请以原厂工程师提供的方案为准。
报错信息如下:

问题分析:
在达梦目标库,手动执行迁移中报错的语句,添加唯一检查性约束失败。

查看数据,添加唯一约束的列数据值不唯一
违反了唯一约束,所以无法添加成功。
目标库 DM :

源库 MySQL:


为什么 源库 MySQL 存在唯一性检查约束,但可以有重复值呢?
因为 MySQL 约束列值存在 NULL , MySQL 认为“ 1 , NULL ”和“ 1 , NULL ”并不相等,所以和唯一性约束不冲突,
但达梦和 Oracle 认为是相等的,和唯一性约束冲突,插入数据是会报错,测试如下 :
###MySQL mysql> create table cjc.t1(id int,name varchar(10),time datetime,UNIQUE KEY u_id(id,name)); Query OK, 0 rows affected (0.01 sec) mysql> mysql> insert into cjc.t1 values(1,null,now()); Query OK, 1 row affected (0.01 sec) mysql> insert into cjc.t1 values(1,null,now()); Query OK, 1 row affected (0.01 sec) mysql> insert into cjc.t1 values(1,null,now()); Query OK, 1 row affected (0.00 sec) mysql> select * from cjc.t1; +------+------+---------------------+ | id | name | time | +------+------+---------------------+ | 1 | NULL | 2024-07-26 14:59:09 | | 1 | NULL | 2024-07-26 14:59:10 | | 1 | NULL | 2024-07-26 14:59:11 | +------+------+---------------------+ 3 rows in set (0.00 sec) ###DM SQL> create table cjc.t1(id int,name varchar(10),time datetime,CONSTRAINT uk_t1 UNIQUE (id,name)); 操作已执行 已用时间: 20.489(毫秒). 执行号:503. SQL> SQL> insert into cjc.t1 values(1,null,now()); 影响行数 1 已用时间: 2.228(毫秒). 执行号:504. SQL> insert into cjc.t1 values(1,null,now()); insert into cjc.t1 values(1,null,now()); [-6625]:违反表[t1]唯一性约束条件[uk_t1]. 已用时间: 0.279(毫秒). 执行号:0. Oracle: ORA-00001: unique constraint(CJC.UK_T1) violated
解决方案:
数据迁移没问题,直接在目标达梦库添加唯一约束失败,和相关同事沟通,
源库 MySQL 这个检查性约束没有启作用,目标库也不需要添加这个约束,暂时忽略这个错误。
数据库迁移时,修改对象所属者,比如 T1 表所属者由 CHEN 修改为 CJC 。
迁移过程中,发现 T1 表所属者自动改为 CJC ,但 T1 表上的 FK_T1 外键所属者还是 CHEN ,自动转换失败,
如果没有提前创建 CHEN 用户,将会提示 [-2103]: 无效的模式名。
报错信息如下:
添加某个表的外键报错: [-2103]: 无效的模式名 [CHEN]
将报错的 SQL 语句手动在目标端执行也报错。

解决方案:
在迁移转换过程中,需要在 DTS 工具上,取消“保留引用表原有模式信息”的勾选

问题描述:
MySQL 迁移到达梦数据库后,发现带有自增列的数据和迁移前不一致:
例如 :
T1 表 ID 列是自增列,原 MySQL 库 T1 表 ID 列数据是 1,2,3 。
从 MySQL 迁移到达梦 DM 数据库后,发现 T1 表 ID 列数据变成了 4,5,6 。
如果业务基于自增列数据有实际意义,应用可能会出现异常。
问题原因:
迁移过程中,设置表映射关系时,没有选中 启用标志列插入 选项。

解决方案:
迁移过程中,设置表映射关系时,需要勾选 启用标志列插入 选项,重新迁移。
迁移工具 : 达梦 DTS
迁移方式 : 离线迁移 ( 源库不产生新数据 )
1. 目标达梦库,提前创建对应用户和表空间等;
2. 目标达梦库修改兼容参数 :
MySQL 迁移到达梦数据库,需要提前修改达梦 dm.ini 配置文件 COMPATIBLE_MODE 参数,由 0 改成 4 ,重启生效。
数字代表的含义:
#Server compatible mode, 0:none, 1:SQL92, 2:Oracle, 3:MS SQL Server, 4:MySQL, 5:DM6, 6:Teradata
注意:如果目标库还和其他应用共用,需谨慎修改。
3. 迁移工具准备
DTS ,建议使用图形化方式,如果达梦数据库服务器不支持图形化,需要提前准备一台支持图形化的服务器,安装达梦 DTS 工具,并检查网络关系。
4. 梳理迁移数据库信息
(1) 数据量
如果数据量较大,需要提前评估迁移时间;
(2) 数据库、用户权限信息
(3) 对象信息
如果有比较复杂的对象,提前评估语法兼容性。
###分区表###
select table_schema,table_name,count(*) from information_schema.partitions where partition_name is not null group by table_schema,table_name;
###视图###
select table_schema,table_name,definer from information_schema.views where table_schema in ('chen');
###触发器###
select trigger_schema,trigger_name,definer from information_schema.triggers where trigger_schema in ('chen');
###存储过程###
select routine_schema,routine_name,routine_type,definer from information_schema.routines where routine_schema in ('chen');
###event###
select event_schema,event_name,definer from information_schema.events where event_schema in ('chen');
2.2迁移
打开达梦 DTS 迁移工具


源库

目标库


(1) 检查对象数量
SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM DBA_OBJECTS WHERE OWNER IN ('CJC');
(2)检查对象大小
SELECT OWNER,SUM(BYTES)/1024/1024 FROM DBA_SEGMENTS WHERE OWNER IN ('CJC');
(3) 业务验证
###chenjuchao 20240726###
欢迎关注我的公众号《 IT 小 Chen 》

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-3023524/ ,如需转载,请注明出处,否则将追究法律责任。