文章目录

  • 1、初始化实例参数选择
  • 2、迁移步骤
  • 3、常见问题及解决方法
  • 3.1 使用DTS工具连接MySQL报错
  • 3.1.1 权限拒绝
  • 3.1.2 驱动问题
  • 3.2 迁移报错非法的identity列类型
  • 3.3 时间的约束表达式无效
  • 3.4 长度超出定义(字符串截断)
  • 3.5 错误的时间类型格式
  • 4、迁移完成,统计信息收集,应用验证


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_CHAR

VARCHAR 类型对象的长度是否以字符为单位。取值: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%以上的转换;
第二步:只迁移表数据,一般问题都是出现在此步骤,后面会介绍到相关问题及处理方法;
第三步:只迁移约束和索引,此步骤一般不会报错;
第四步:只迁移视图。

打开达梦迁移工具,新建工程

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_TIMESTAMPDIFF 达梦适配


右键迁移,新建迁移

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_bc_02

选择迁移方式MySQL–DM

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_数据库_03

输入源端和目标端信息,选择对应的库

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_dba_04


TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_05

选择迁移方式

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_数据库_06

选择迁移策略:只选择表结构

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_07

然后下一步,完成,即完成对表结构的迁移

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_bc_08

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

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_09


TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_数据库_10

最后迁移视图

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_数据库_11

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连接串;

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_12


TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_13


URL写法如下:

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

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

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_mysql_14


原因:达梦只支持int和bigint类型的列为自增列,其他类型的列不支持自增,若出现类似报错,可复制出sql语句,修改对应自增列的类型为int或bigint,手动创建表,然后迁移时只迁移数据;

此问题在新版本的迁移工具中做过float自增列的验证,迁移工具已经可以自行转换;

3.3 时间的约束表达式无效

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_数据库_15


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

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

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_bc_16


原因:该问题和前面第一个初始化指定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 错误的时间类型格式

TIMESTAMPDIFF 达梦适配 达梦 case_sensitive参数不匹配_dba_17

原因: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; --统计信息收集动态视图(全库)