ITPub博客

首页 > 数据库 > 国内数据库 > MySQL 迁移到达梦实施方案及问题汇总

MySQL 迁移到达梦实施方案及问题汇总

原创 国内数据库 作者:chenoracle 时间:2024-07-26 20:08:55 0 删除 编辑

说明 :

仅供测试参考,实际迁移方法请以原厂工程师提供的方案为准。

一 : 迁移过程中遇到的问题

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
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 》

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

请登录后发表评论 登录
全部评论
Oracle ACE、OCMU 用户组成员、Oracle 11g OCM、微信公众号"IT小Chen"

注册时间:2014-08-05

  • 博文量
    853
  • 访问量
    2727009