使用DTS工具将mysql迁移到DM

使用DTS工具将mysql迁移到DM

一、环境准备

1.1MySQL:

数据库名称数据库版本IP用户名密码库名
MySQLVer 8.0.33 for Linux on x86_64192.168.20.60dmdbadmdbasakila

测试数据文件:

这里我使用的是mysql8.0自带的测试库sakila,具体可以到官方网站上下载

数据表数量:

mysql> show tables;
+----------------------------+
| Tables_in_sakila           |
+----------------------------+
| actor                      |
| actor_info                 |
| address                    |
| category                   |
| city                       |
| country                    |
| customer                   |
| customer_list              |
| film                       |
| film_actor                 |
| film_category              |
| film_list                  |
| film_text                  |
| inventory                  |
| language                   |
| nicer_but_slower_film_list |
| payment                    |
| rental                     |
| sales_by_film_category     |
| sales_by_store             |
| staff                      |
| staff_list                 |
| store                      |
+----------------------------+

存储过程:

mysql> show procedure status where db='sakila';
+--------+-------------------+-----------+---------+---------------------+---------------------+---------------+--------------------------------------------------+----------------------+----------------------+--------------------+
| Db     | Name              | Type      | Definer | Modified            | Created             | Security_type | Comment                                          | character_set_client | collation_connection | Database Collation |
+--------+-------------------+-----------+---------+---------------------+---------------------+---------------+--------------------------------------------------+----------------------+----------------------+--------------------+
| sakila | film_in_stock     | PROCEDURE | dmdba@% | 2023-06-25 12:44:24 | 2023-06-25 12:44:24 | DEFINER       |                                                  | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
| sakila | film_not_in_stock | PROCEDURE | dmdba@% | 2023-06-25 12:44:24 | 2023-06-25 12:44:24 | DEFINER       |                                                  | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
| sakila | rewards_report    | PROCEDURE | dmdba@% | 2023-06-25 12:44:24 | 2023-06-25 12:44:24 | DEFINER       | Provides a customizable report on best customers | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+--------+-------------------+-----------+---------+---------------------+---------------------+---------------+--------------------------------------------------+------

1.2DM数据库

数据库规模IP用户表空间模式
DM8单机192.168.20.61dmdbatable_sakilasakila

二、迁移前准备

2.1初始化参数建议

因为本次是将MySQL数据库作为源库迁移到目标库DM数据库,在迁移前我们需要做好相关初始化参数准备。

1)关于页大小 PAGE_SIZE。在 DM 数据库中,页大小可以为 4KB、8KB、 16KB 或者 32KB,从 MySQL 移植到 DM,建议设置页大小为 16KB,一旦创建 好了数据库,在该库的整个生命周期内,页大小都不能够改变。除了每个字段的 最大长度限制外,每条记录总长度不能大于页面大小的一半。如果系统中存在或 者以后可能存在含有较长的字符串类型的表,可以按需调整,最大为 32KB(也 可以设置为 8KB)。页大小设置越大,最后数据文件的物理大小就会越大,系统运行时,每次从磁盘调入内存的数据单位也就越大,所以此处要慎重。

2)关于簇大小 EXTENT_SIZE。数据文件使用的簇大小,即每次分配新 的段空间时连续的页数,只能是 16 页或 32 页,缺省使用 16 页,从 MySQL 移 植到 DM 使用默认值就可

3)关于大小写敏感 CASE_SENSITIVE。DM 为了兼容不同的数据库,在初始化数据库的时候有一个参数字符串比较大小写敏感,用于确定数据库对象及 数据是否区分大小写,默认为区分,不可更改。建议 是更具具体使用情况来决定是否大小写敏感。

4)关于字符集 CHARSET。建议采用默认GB18030

2.2修改兼容参数

在迁移数据之前,需要修改 DM 数据库参数,修改兼容参数为兼容 MySQL 数据库 COMPATIBLE_MODE=4 ,重启数据库服务使其生效即可。

三、数据库迁移步骤

3.1打开DTS工具并创建迁移任务

在这里插入图片描述

3.2新建迁移任务

在这里插入图片描述

右键迁移字样----->新建迁移,输入好对话框信息

3.3选择迁移方式

在这里插入图片描述
在这里插入图片描述

下一步,选择迁移方式为MySQL到DM。

3.4填写MySQL连接信息

在这里插入图片描述

这里填写好MySQL的连接信息,并在数据库名这一栏选择好要迁移的数据库,如右侧下拉栏找不到库名可以点击旁边的刷新按键刷新,同时可根据实际需求调整链接的url参数和指定驱动。

3.5填写DM数据库连接信息

在这里插入图片描述
与之前一样同样可根据实际需求调整链接的url参数和指定驱动。这里要注意登陆用户不能使用SYSDBA用户,需要新建应用用户并关联新的表空间

3.6配置迁移选项

在这里插入图片描述

​ 根据使用情况需求设置配置选项,这里迁移对象方式有三种:手动选择、迁移指定类型对象,以及用SQL指定迁移对象,并且可以自行导入迁移对象。

​ 这里建议取消勾选保持对象大小写,让对象名自动转换成大写。根据实际情况修改字符长度和并发数

3.7指定对象

在这里插入图片描述

在这部分中可以勾选想要迁移的对象,同时选中表对象后可以进行预览,查看数据和类型转换是否合理,左上角“分析源对象“可以统计源对象信息。

迁移策略定义:
在这里插入图片描述

同时支持针对单表迁移定制化操作,这里主要划分为三个模块:

1、表模块,这部分可以进行表定义包括表的存储大小,表存在是否删除,以及表是否压缩

2、数据模块,这部分可以进行表数据的定义,设置数据迁移的方式,是否删除后拷贝数据(主要是防止重复数据出现)、普通表和大字段表迁移的并发数和每次读取以及提交的数量

3、索引以及约束模块,对表索引的定义、对约束的定义

一般来说迁移的的顺序是先将表结构迁移完成后,在将数据库完成迁移,最后把索引和约束,以及存储过程,函数,触发器,等完成迁移。

列映射选项:

在这里插入图片描述

列映射选项支持对单表数据库列的数据类型做精准化修改:

1、数据类型修改

2、精度修改

3、默认值,是否为空,自增,表达式、函数等修改

右下角编辑SQL可以定义建表的类型,建表的SQL,同时可在线预览SQL

在这里插入图片描述

注意事项:

1、迁移策略定义内容可以同时复用到其他同类型对象

2、列映射选项无法复用到其他同类型对象

3、当在手工编辑建表语句界面修改后将不能再列映射选项内做修改

3.8审阅迁移任务

在这里插入图片描述

在该界面确认迁移信息,无误后点击下方完成

三、问题排查解决

3.1 自定义字段转换

上述转换中存在迁移后某些字段类型不正确,和地理字段无法使用的情况,解决方案如下:

从MySQL的表结构可以查看到主要使用到的字段如下,现在为了导入的数据部出错现自定义MySQL到DM数据库的字段转换:

MySQL字段DM数据库字段
smallintsmallint
varchar(精度匹配)varchar(精度匹配)
geometrySYSGEO.ST_GEOMETRY(需要引入系统包)
timestamptimestamp
tinyint unsignedint
smallint unsignedint
tinyinttinyint
intint
datetimetimestamp
BLOB当需要创建索引时,存储数据范围允许的情况下可以改用varchar字段。不需创建索引时可建为BLOB类型
CLOB同BLOB
decimal(精度按实际情况确定)decimal(精度按实际情况确定)
texttext 或 varchar2
enumchar或者varchar(具体看存储内容)
set同enum
yearchar

3.2 自增字段问题

通过 DTS 做 MYSQL 到 DM 表结构迁移,在 MYSQL 表结构默认值使用 AUTO_INCREMENT 函数来做自增长,会报错 AUTO_INCREMENT。

达梦数据库当前通过 IDENTITY(1,1)函数设置自增长,等效于 mysql 的 AUTO_INCREMENT。
在进行等价改写的时候,需要先通过如下 SQL 确定 mysql 数据库的自增设置:

show variables like 'auto_increment';

然后对对表结构的auto_increment 改写。

注意:

1、DM的IDENTITY只能用于int和bigint两种数据类型,如果出现其他类型需要改写

2、迁移时注意源表当前的自增值,确定 IDENTITY(m,1)函数中m的取值

3.3 CURRENT_TIMESTAMP 字段类型的处理

MySQL 的字段可以定义 CURRENT_TIMESTAMP 类型,实际后台是触发器帮助更新行数据的时间戳,达梦可以用相同的触发器原理仿真,就是需要一些修改的工作量。

实现最后更新时间功能,即数据新建为新建时间,数据修改时自动更新为当前时间

测试示例如下:

drop TABLE T1;

CREATE TABLE T1(
A INT NOT NULL,
B DATETIME(6) DEFAULT sysdate,
C CHAR(10),
PRIMARY KEY(A)
);

insert into t1(a,c) values (1,'a');
insert into t1(a,c) values (2,'b');

create or replace trigger tg_1
before update on t1 for each row
begin
:new.b=sysdate;
end;
/

3.4 TIMESTAMP 类型

​ 在 MySQL 中 时 间 类 型 TIMESTAMP 默 认 default 设 置 为“ 0000-00-0000:00:00 ” , 而 在 DM 中 TIMESTAMP 类 型 数 据 不 能 为“0000-00-0000:00:00”,在 DM 中是不合法的,必须在’0001-01-0100:00:00.000000’ 到’9999-12-3123:59:59.999999’之间。

​ 解决方案为可以修改MySQL端的元数据。

3.5 DEFAULT 设置

对于字段的 default 设置,默认的字符或字符串默认值,需要添加单引号’',如 achar(10)default ‘abc’

3.6 ON UPDATE 时间字段属性改造

MySQL 中的建表语句:

SQL
CopyCREATE TABLE TEST (
id int(11) NOT NULL,
name varchar(20),
modifytime timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
);

在达梦数据库中的改造:

SQL
CopyCREATE TABLE TEST (
id int NOT NULL,
name varchar(20),
modifytime timestamp NOT NULL default CURRENT_TIMESTAMP
);

配合触发器使用:

SQL
Copycreate or replace trigger update_time
before update on HR.TEST for each row
begin
new.modifytime:=sysdate;
end;
/

3.7 mysql 累加写法改写

例如:在 mysql 中累加写法如下:

SQL
CopySELECT id , name , age ,
(@age:=@age + age ) as  age_sum
FROM user , ( SELECT @age := 0  ) s
ORDER BY id

dm 数据库中通过分析函数实现改写。

SQL
CopySELECT id , name , age ,
sum(age) OVER (ORDER BY id asc) AS ageRank
FROM user;

3.8 GROUP_CONCAT 函数改写

对于 group_concat 函数,可以采用 DM 的 LISTAGG 函数进行替换,如下为MySQL 和 DM 中的函数应用和效果,如下:

--MySQL

select  group_concat(ifnull(OPEN_STEP, '10') order by ID ASC separator '、、') from ZHZB_DEV.BID_PACKAGE BP;

select  group_concat(ifnull(OPEN_STEP, '10') order by ID ASC separator '、、') from ZHZB_DEV.BID_PACKAGE BP group by AGENT_ ID;

--DM

select LISTAGG(ifnull("BP"."OPEN_STEP", '10'),' 、、 ') WITHIN GROUP(ORDER BY "BP"."ID" ASC) from ZHZB_DEV.BID_PACKAGE BP;

select LISTAGG(ifnull("BP"."OPEN_STEP", '10'),' 、 、 ') WITHIN GROUP(ORDER BY "BP"."ID" ASC) from ZHZB_DEV.BID_PACKAGE BP group by "BP"."AGENT_ID" ;

3.9 DATE_ADD函数

date_add 函数若对添加时间间隔的表达式进行求值,可采用 DM 的 TIMESTAMPADD 函数进行替代.

--MySQL

select DATE_ADD(sysdate(), INTERVAL 1 YEAR);

-- DM

select TIMESTAMPADD(SQL_TSI_YEAR, 1,sysdate());

达梦数据库社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值