说明:
仅供测试参考,实际迁移方法请以原厂工程师提供的方案为准。
一:迁移过程中遇到的问题
1.违反唯一性约束
报错信息如下:
问题分析:
在达梦目标库,手动执行迁移中报错的语句,添加唯一检查性约束失败。
查看数据,添加唯一约束的列数据值不唯一
违反了唯一约束,所以无法添加成功。
目标库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 和 Oracle 限制更严格,无法插入,报违反唯一性约束错误:
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这个检查性约束实际上也没有在用,目标库也不需要添加这个约束,暂时忽略这个错误。
2.外键模式转换失败
数据库迁移时,修改对象所属者,比如T1表所属者由CHEN修改为CJC。
迁移过程中,发现T1表所属者自动改为CJC,但T1表上的FK_T1外键所属者还是CHEN,自动转换失败,如果没有提前创建CHEN用户,将会提示[-2103]:无效的模式名。
报错信息如下:
添加某个表的外键报错:[-2103]:无效的模式名[CHEN]
将报错的SQL语句手动在目标端执行也报错。
解决方案:
在迁移转换过程中,需要在DTS工具上,取消“保留引用表原有模式信息”的勾选
3.自增列数据异常
问题描述:
MySQL迁移到达梦数据库后,发现带有自增列的数据和迁移前不一致:
例如:
T1表ID列是自增列,原MySQL库T1表ID列数据是1,2,3。
从MySQL迁移到达梦DM数据库后,发现T1表ID列数据变成了4,5,6。
如果业务基于自增列数据有实际意义,应用可能会出现异常。
问题原因:
迁移过程中,设置表映射关系时,没有选中 启用标志列插入 选项。
解决方案:
迁移过程中,设置表映射关系时,需要勾选 启用标志列插入 选项,重新迁移。
二:MySQL迁移到达梦
迁移工具:达梦DTS
迁移方式:离线迁移(源库不产生新数据
2.1迁移前准备
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迁移工具
源库
目标库
2.3迁移后检查
(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》