MySQL到DM迁移及常见问题解决方法

本文详细介绍了从MySQL迁移到达梦数据库的步骤,包括实例初始化参数的选择,如页大小、簇大小、大小写敏感性和字符集等。在迁移过程中可能遇到的问题,如权限拒绝、驱动问题、非法identity列类型、时间约束表达式无效和字符串截断等,并提供了相应的解决方案。最后,文章强调了迁移完成后的统计信息收集和应用验证的重要性。
摘要由CSDN通过智能技术生成

1、初始化实例参数选择

初始化实例的参数指定以后,在数据库的整个生存周期内将无法更改

./dminit path=/dmdata page_size=32 extent_size=32 CASE_SENSITIVE=0 CAHRSET=1 LENGTH_IN_CHAR=1

参数说明:

page_size数据文件使用的页大小。取值:4、8、16、32,单位:K。默认值为 8。可选参数。选择的页大小越大,则 DM 支持的元组长度也越大,但同时空间利用率可能下降
extent_size数据文件使用的簇大小,即每次分配新的段空间时连续的页数。取值:16、32、64。单位:页数。缺省值 16。可选参数。
CASE_SENSITIVE标识符大小写敏感
CAHRSET字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。可选参数。
LENGTH_IN_CHARVARCHAR 类型对象的长度是否以字符为单位。取值:1、Y 表示是,0、N 表示否。默认值为 0。可选参数。

CASE_SENSITIVE:
在大小写敏感的情况下,达梦对不加双引号的字符串全部默认为大写,所以如果对字符串加双引号对程序改动量很大的情况下,建议选择大小写不敏感,具体要求需要根据实际情况决定;

如下为大小写敏感和不敏感的区分:
对象名的识别:

1、大小写敏感:
CREATE TABLE TEST.Abc(COL INT);
SELECT * FROM TEST.Abc;     ------执行成功
SELECT * FROM TEST.ABC;     ------执行成功
SELECT * FROM TEST."Abc";   ------error:无效的表或视图名[Abc]
SELECT * FROM TEST."ABC";   ------执行成功

2、大小写不敏感:
CREATE TABLE TEST.a(C1 INT);
SELECT * FROM TEST.a;    ------执行成功
SELECT * FROM TEST.A;    ------执行成功
SELECT * FROM TEST."a";  ------执行成功
SELECT * FROM TEST."A";  ------执行成功

字符串内容的识别:

CREATE TABLE  TEST(COL VARCHAR(100));      ---创建表TEST

INSERT INTO TEST VALUES('Abc');            ---插入数据Abc
INSERT INTO TEST VALUES('ABC');            ---插入数据ABC
1、大小写敏感:
SELECT COUNT(*) FROM TEST WHERE COL='Abc'; ------结果为1
SELECT COUNT(*) FROM TEST WHERE COL='ABC'; ------结果为1

2、大小写不敏感:
SELECT COUNT(*) FROM TEST WHERE COL='Abc'; ------结果为2
SELECT COUNT(*) FROM TEST WHERE COL='ABC'; ------结果为2

LENGTH_IN_CHAR:
一般常见的MySQL5.0及以上的版本其varchar类型的字段以字符为单位存储,更早的版本以字节为单位存储;
以字节为单位和以字符为单位存储的区别为:
以字节为单位存储时:varchar(50)指的是50字节,如果存储UTF8汉字时(一个汉字占三个字节),最多只能存放16个;
以字符为单位存储时:varchar(50)指的是50个字符,即存储UTF8汉字时,依然能存储50个汉字;
所以迁移MySQL库到达梦时,建议指定该参数为1;

2、迁移步骤

为方便排查问题,迁移分为四步进行:
第一步:只迁移表结构,此步骤新版本DTS工具基本上可以完成95%以上的转换;
第二步:只迁移表数据,一般问题都是出现在此步骤,后面会介绍到相关问题及处理方法;
第三步:只迁移约束和索引,此步骤一般不会报错;
第四步:只迁移视图。

打开达梦迁移工具,新建工程
在这里插入图片描述
右键迁移,新建迁移
在这里插入图片描述

选择迁移方式MySQL–DM
在这里插入图片描述

输入源端和目标端信息,选择对应的库
在这里插入图片描述
在这里插入图片描述

选择迁移方式
在这里插入图片描述

选择迁移策略:只选择表结构
在这里插入图片描述

然后下一步,完成,即完成对表结构的迁移
在这里插入图片描述

接下来对数据和索引迁移,和前面迁移表结构步骤一样,只不过转换策略里做改变,这里只对数据勾选,其他勾选取消,迁移完成后,再迁移约束和索引、表及字段注释,和此步骤方法一致
在这里插入图片描述
在这里插入图片描述

最后迁移视图
在这里插入图片描述

3、常见问题及解决方法

3.1 使用DTS工具连接MySQL报错

3.1.1 权限拒绝
错误消息: Access denied for user 'test'@'%' to database 'mysql'

原因是:mysql的安全性,权限设置默认是拒绝外部连接的
关注如下两个权限:
Grant_priv:确定用户是否可以将已经授予给该用户自己的权限再授予其他用户。
Select_priv :确定用户是否可以通过SELECT命令选择数据。

查询权限,发现test用户的Grant_priv 和 Select_priv 操作权限都是 N

mysql>  SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
+---------------+---------------+------------+------------+
| host          | user          | Grant_priv | Super_priv |
+---------------+---------------+------------+------------+
| %             | root          | Y          | Y          |
| localhost     | mysql.session | N          | Y          |
| localhost     | mysql.sys     | N          | N          |
| %             | test          | N          | N          |
+---------------+---------------+------------+------------+
4 rows in set (0.00 sec)

更改权限并刷新以后即可连接:

mysql> UPDATE mysql.user SET  Grant_priv = 'Y',  Super_priv = 'Y' where user='test';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
+---------------+---------------+------------+------------+
| host          | user          | Grant_priv | Super_priv |
+---------------+---------------+------------+------------+
| %             | root          | Y          | Y          |
| localhost     | mysql.session | N          | Y          |
| localhost     | mysql.sys     | N          | N          |
| %             | test          | Y          | Y          |
+---------------+---------------+------------+------------+
4 rows in set (0.00 sec)
3.1.2 驱动问题
    如果迁移MySQL8.0的数据库,可能会有驱动相关的报错.
错误信息:Unknown character set index for field '255' received from server.

原因:MySQL版本高,mysql的jar版本低造成mysql与jar的编码错乱,也就是说默认的jar包版本过低,于是指定对应mysql的新的驱动,手动修改URL连接串;
在这里插入图片描述
在这里插入图片描述
URL写法如下:

jdbc:mysql://localhost:3306/<database_name>?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true

3.2 迁移报错非法的identity列类型

在这里插入图片描述
原因:达梦只支持int和bigint类型的列为自增列,其他类型的列不支持自增,若出现类似报错,可复制出sql语句,修改对应自增列的类型为int或bigint,手动创建表,然后迁移时只迁移数据;
此问题在新版本的迁移工具中做过float自增列的验证,迁移工具已经可以自行转换;

3.3 时间的约束表达式无效

在这里插入图片描述
原因:currrent_timestamp()加了单引号的原因,可取出该sql,去掉current_timestamp()两边的单引号,手动在达梦端执行建表,然后迁移时选择只迁移数据;

3.4 长度超出定义(字符串截断)

在这里插入图片描述
原因:该问题和前面第一个初始化指定length_in_char参数有关联,如果初始化库的时候指定了length_in_char=1参数,基本上不会再报这个错误,如果没有指定,而实例又不允许重建,可选择在达梦端扩展varchar类型的列长度的方式,由于UTF8字符集存储汉字时1个汉字占3个字节,所以,长度通常扩展为原来的3倍;

扩列语句如下:
其中OWNER为模式名,可根据实际情况自行修改模式名,执行输出的结果为扩列语句,需要将执行结果复制粘贴在达梦端执行一遍。

针对整个用户下的所有表的修改:
SELECT  'ALTER TABLE '||A.OWNER||'.'||A.TABLE_NAME||' MODIFY  '||A.COLUMN_NAME||' VARCHAR('||A.DATA_LENGTH*3||');'
FROM DBA_TAB_COLUMNS  A
WHERE OWNER='TEST123' AND DATA_TYPE LIKE 'VARCHAR';

针对单张表的修改:
SELECT  'ALTER TABLE '||A.OWNER||'.'||A.TABLE_NAME||' MODIFY  '||A.COLUMN_NAME||' VARCHAR('||A.DATA_LENGTH*3||');'
FROM DBA_TAB_COLUMNS  A
WHERE OWNER='TEST123' and table_name like 'ADD_SUB_ITEM' AND DATA_TYPE LIKE 'VARCHAR';

3.5 错误的时间类型格式

在这里插入图片描述

原因:MySQL端有"0000-00-00"格式的年月日存储方式,达梦中不允许月和日为0,可在源端将这些数据改为"0000-01-01",然后迁移即可;
为安全起见,原表不做改变,可将此错误的表复制一份,然后做修改;

4、迁移完成,统计信息收集,应用验证

统计信息收集语句:

DBMS_STATS.GATHER_SCHEMA_STATS('SYSDBA',100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); --收集SYSDBA模式下 所有索引的统计信息
select * from sysstats; --统计信息收集动态视图(全库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值