使用DTS工具将mysql迁移到DM
一、环境准备
1.1MySQL:
数据库名称 | 数据库版本 | IP | 用户名 | 密码 | 库名 |
---|---|---|---|---|---|
MySQL | Ver 8.0.33 for Linux on x86_64 | 192.168.20.60 | dmdba | dmdba | sakila |
测试数据文件:
这里我使用的是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.61 | dmdba | table_sakila | sakila |
二、迁移前准备
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数据库字段 |
---|---|
smallint | smallint |
varchar(精度匹配) | varchar(精度匹配) |
geometry | SYSGEO.ST_GEOMETRY(需要引入系统包) |
timestamp | timestamp |
tinyint unsigned | int |
smallint unsigned | int |
tinyint | tinyint |
int | int |
datetime | timestamp |
BLOB | 当需要创建索引时,存储数据范围允许的情况下可以改用varchar字段。不需创建索引时可建为BLOB类型 |
CLOB | 同BLOB |
decimal(精度按实际情况确定) | decimal(精度按实际情况确定) |
text | text 或 varchar2 |
enum | char或者varchar(具体看存储内容) |
set | 同enum |
year | char |
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