文章目录
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%以上的转换;
第二步:只迁移表数据,一般问题都是出现在此步骤,后面会介绍到相关问题及处理方法;
第三步:只迁移约束和索引,此步骤一般不会报错;
第四步:只迁移视图。
打开达梦迁移工具,新建工程
右键迁移,新建迁移
选择迁移方式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; --统计信息收集动态视图(全库)