DM DTS基于成熟的关系数据模型和标准接口,跨越多种主流大型数据库,能以极少的系统开销实现数据迁移工作。DM DTS的技术原理图如下图所示:
DM数据迁移工具提供了主流大型数据库迁移到DM、DM迁移到主流大型数据库、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。
DM数据迁移工具支持:
- DM数据库之间模式、表、序列、视图、存储过程/函数、包、触发器、对象权限的迁移
- 主流大型数据库Oracle、SQLServer、MySQL、DB2、PostgreSQL、Informix、Kingbase、Sybase的模式、表、视图、序列、索引迁移到DM
- DM的模式、表、视图、序列、索引迁移到主流大型数据库Oracle、SQLServer、MySQL
- ODBC数据源、JDBC数据源的模式、表、视图迁移到DM
- DM数据库模式、表、序列、视图、存储过程/函数、包、触发器、对象权限迁移到XML文件,SQL脚本文件
- DM数据库的表、视图数据迁移到文本文件,Excel文件,Word文件
- 指定格式的文本文件,Excel文件,Word文件,XML文件和SQL脚本文件迁移到DM数据库
注:流程图中标注的迁移序列、表、视图、其他数据库对象这个流程顺序,在DTS工具中就已经自动处理了,自动按照这个顺序进行依次执行,如果我们需要手动迁移单独的几类数据库对象,需要按照序列、表、视图、其他数据库对象这个顺序进行。在表迁移的时候需要注意,表的迁移是有顺序的,按照表定义、数据、约束、索引、注释的顺序来进行迁移。
对于异构数据库迁移到达梦,在迁移之前,需要对源端数据库的一些信息进行收集,以便迁移方案的制定以及迁移评估,需要收集的信息如下表格:
调研项 | 调研情况 |
数据库版本/驱动版本 | |
字符集编码 | |
大小写是否敏感 | |
是否以字节为单位 | |
用户/模式 | |
用户权限 | |
表空间(数据、索引) | |
数据对象个数 | |
大字段表个数 |
- 初始化数据库
源端为Mysql的情况下,对于目的端达梦库的初始化参数,需要做好规划,需要注意如下参数:
- PAGE_SIZE:页大小默认为8K,建议设置成32K,一条记录的长度,受到页大小的限制,不可以超过页大小的一半,所以建议一开始规划页大小为32K;
- EXTENT_SIZE:簇大小默认为16页,建议设置成32页;
- CASE_SENSITIVE:默认是大小写敏感,源端为Mysql情况下,建议设置成大小写不敏感
- BLANK_PAD_MODE:空格填充参数,是否要兼容Mysql进行设置,即在BLANK_PAD_MODE=0的情况下,’A’和’A ’被认为是相同的值,参数为1的情况下,认为是两个不同的值,根据现场具体应用的需求进行设置
- CHARSET:字符集编码,可选GB18030、UTF-8,默认为GB18030,如果只存储中文和字母数字,使用GB18030更节省空间;
- LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位,默认是以字节为单位,此参数和字符集编码结合使用,所能存储的字符个数有所不同,详见如下表格:
- COMPATIBLE_MODE:兼容参数,置为4为部分兼容Mysql参数,在dm.ini中可以进行配置,如果默认0的情况下,达梦视null不等同于空字符串,用户可能会插入空串,会导致is null查不出全部数据,所以视情况而定是否需要修改;
目的端的表空间规划,参照源库表空间使用情况即可,另需注意,如源库存储业务数据并不存在独立表空间,目的端则需要创建单独的业务表空间(包括数据表空间以及索引表空间);
目的端达梦的表空间需要根据源端数据量情况,规划表空间数据文件个数以及单个数据文件上限,单个数据文件不宜过大,可以创建多个数据文件;
需要根据源端表空间使用情况进行规划目的端数据文件初始大小,避免在迁移过程中频繁自动扩展,影响迁移速度。
目的端用户参照源库用户进行创建,对于权限设置、资源限制要求等内容需要按照目的端达梦实际上线要求进行设置,因系统正式切割之后,会涉及到等保及分保测评,所以在用户规划时,需要注意测评要求,如下:
- 创建用户授予权限,不建议授予DBA角色,一般的权限,授予resource、public、vti、soi、svi这几个角色即可满足使用要求,其中各个角色的介绍,如下图所示,其中SVI角色,在新版本大概114及之后才会有,之前的版本,授予resource、public、vti、soi即可。
- 设置用户的资源限制参数中,比较常用的几个参数如下图,图中显示参数缺省值均为在通用机情况下:
- 口令限制,在通用机中创建的用户口令长度,复杂度默认只有口令长度九位,即PWD_POLICY=2,在ZYJ中,该参数默认值为14,参数值含义如下:
用户口令最长为 48 字节,创建用户语句中的 PASSWORD POLICY 子句用来指定该用
户的口令策略,系统支持的口令策略有:
0 无策略
1 禁止与用户名相同
2 口令长度不小于 9
4 至少包含一个大写字母(A-Z)
8 至少包含一个数字(0-9)
16 至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号)
口令策略可单独应用,也可组合应用。组合应用时,如需要应用策略 2 和 4,则设置
口令策略为 2+4=6 即可
该参数不可以在dm.ini中直接修改,需要用SP_SET_PARA_VALUE系统过程来修改,如SP_SET_PARA_VALUE(1, 'PWD_POLICY',8);
-
-
- DTS工具优化
-
- 设置合理的JVM内存参数:
- -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
- -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
- -Xmn Java Heap Young区大小,不熟悉最好保留默认值;
- -Xss 每个线程的Stack大小,不熟悉最好保留默认值;
- 设置方式
- window环境下设置dts工具jvm内存值:在安装目录dmdbms\tool下修改dts.ini 文件中添加内存参数配置,如: -Xms2048m -Xmx2048m
- linux环境下设置dts工具jvm内存值:在安装目录dmdbms\tool下修改dts 文件中添加内存参数配置,如: -Xms2048m -Xmx2048m
- 在迁移前,先在本地数据库新建一个空库,并将要迁移到达梦数据库的MySQL数据库复制到本地的这个空库中,因为接下来需要修改某些表的设置。
- CURRENT_TIMESTAMP
CURRENT_TIMESTAMP是MySQL的函数,达梦不支持该函数,如果使用了这个函数,那么需要修改。
例如将TABLE_NAME表中的updated_at字段修改为datetime类型,并去掉默认值。
- 0000-00-00 00:00:00
如果你的时间字段中有0000-00-00 00:00:00这样的数据,也是无法迁移成功的,可以批量改为1970-01-01 00:00:00 - 修改char为varchar
有的字段设置了默认值时,迁移时可能会提示长度不足。
例如设定了user_sex这个字段为char(1),默认值为男,那么需要改为char(3)或者改为varchar(1) - 注意:varchar的长度与你初始化数据库时的这两个参数UNICODE_FLAG和LENGTH_IN_CHAR相关。
- UNICODE_FALG:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用select unicode来查询当前数据库的字符集种类,0代表gb18030,1代表UTF8。
- LENGTH_IN_CHAR:此参数决定了,数据库中的varchar类型对象的长度是否以字符为单位。取值为1则设置为以字符为单位,将存储长度值按照理论字符长度进行放大。取值为0则所有varchar类型对象的长度以字节为单位。
- enum类型
例如enum('男','女')
这种类型的字段需要改为
使用SYSDBA用户登录DM管理工具,新建两个表空间:TEST_DATA、TEST_IDX,分别用于存储表和索引。
新建管理用户,选择刚创建的两个表空间,密码长度至少为9位。
所属角色,勾选PUBLIC,并勾选所需要的权限
新建用户后,将出现同名的模式。
断开连接,使用刚创建的TEST用户登录。
DM DTS 工具存放在 DM 数据库安装目录下 tool 文件夹,执行 ./dts 即可运行 DM DTS 工具。新建工程,选择迁移,并右键新建迁移。
在新建工程对话框中填写工程名和工程描述信息,点击【确定】按钮,成功添加了一个工程。如下图所示:
展开工程节点,选择【新建迁移】。输入迁移名称:test项目数据迁移,点击【确定】按钮,完成迁移的创建。如下图所示:
迁移名称,迁移描述也是可以任意填写的
默认打开目录为 DM DTS 工具介绍,选择【下一步】。迁移方式选择 【MySQL-->DM】 方式,如下图所示:
分别输入主机名 (IP) 端口(MySQL 默认端口 3306,DM 默认端口 5236),用户名和口令(DM 默认口令 SYSDBA),数据库名 (默认),如下图所示:
选择源模式和目的模式。从数据源复制对象,目的模式可选择现有模式,如下图所示:
取消勾选视图,视图最后迁移;取消勾选保持对象名大小写
选择你要迁移的表,点击转换
选择”应用当前选项到其它选项”,在新出现的框框里点击”选择”,确定
只迁移表定义,数据,约束,索引,表及字段注释都不选
点击确定,下一步
点击完成
接下来对数据和索引迁移,和前面迁移表结构步骤一样,只不过转换策略里做改变,这里只对数据勾选,其他勾选取消
再重复以上步骤
重复以上步骤,转换策略里做改变
最后在迁移视图
重复上述步骤
用户可查看迁移过程重要参数和修改条件,如需修改,可执行上一步进行修改,确认无误后,点击【完成】,如下图所示:
完成数据迁移后,我们还需对迁移的数据进行验证,表、视图、存储过程、序列都存在且与原数据一致,迁移完成。如下图所示:
迁移完成之后,需要对于源端以及目的端做数据库对象数、数据量进行对比,确认迁移的正确性,以迁移正确性来衡量迁移成功与否,所以迁移完成之后,迁移验证工作是重要且必须的,目前提供了几种迁移验证的方式,其中包括SQL脚本对比方式、compare工具、VERI工具等,详见迁移验证文档。
在之前的测试迁移,适配完成之后做的一些优化工作,可以创建一张记录表,将优化手段记录在一张表中,在正式迁移完成之后,将前期优化过程中添加的索引等内容进行补录。
先进行模式级别更新,再更新索引统计信息,也可以根据需求,进行单独表或者单独列进行更新,下面列出来一些更新统计信息的方式:
注意:大表更新统计信息尽量采用更新关联列、条件列以及索引的统计信息,不要更新全表。
- 模式更新:
DBMS_STATS.GATHER_SCHEMA_STATS( '模式名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
注:如果数据量较大,该过程可能较慢,请耐心等待。
- 收集表的统计信息
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
- 收集列的统计信息
SP_COL_STAT_INIT('模式名','表名','列名');
- 清除列的统计信息
SP_COL_STAT_DEINIT('模式名','表名','列名');
- 收集索引的统计信息
CALL SP_INDEX_STAT_INIT('模式名','索引名');
DBMS_STATS.GATHER_INDEX_STATS(user,'索引名');
STAT <统计信息采样百分比> ON INDEX [<模式名>.]<索引名>;
- 对表上所有索引生成统计信息
CALL SP_TAB_INDEX_STAT_INIT('模式名','表名');
- 收集表中某列的统计信息
STAT <统计信息采样百分比> ON [<模式名>.]<表名>(<列名>);
如:STAT 100 ON TEST(A);
因为更新索引统计信息比较常用,现写了个过程,将更新一个模式下的所有索引统计信息的语句输出到一个sql文件中,在需要执行时候,直接执行sql脚本文件,在索引数量很多情况下,执行sql脚本可以看到执行到哪条语句,语句如下,SYSDBA换成现场需要的业务模式名,将UTL_FILE.FOPEN中指定的路径地址以及脚本文件,换成现场实际环境的信息。
注意:
- 如果是非 WINDOWS环境,且运行达梦服务器的进程有效用户为 root, 则禁止文件操作;
- 执行操作的数据库用户必须有DBA权限;
- 只能创建、修改在达梦系统目录(含子目录)下的文件。用户可以通 过 select * from v$dm_ini where para_name like '%SYSTEM_PATH%';查看系统目录。
declare HANDLE UTL_FILE.FILE_TYPE; begin HANDLE :=UTL_FILE.FOPEN('D:\dm8\94\dmdbms\data\DAMENG', 'utl_test.sql', 'W'); for rec in ( select INDEX_NAME from dba_indexes WHERE table_owner='SYSDBA' ) loop UTL_FILE.PUTF(HANDLE,'stat 100 on index %s;',rec.INDEX_NAME); UTL_FILE.FFLUSH(HANDLE); end loop; UTL_FILE.FCLOSE(HANDLE); end; / |
完成整体的迁移工作后,如果为正式迁移,需要对系统做一次全库备份,如果是测试迁移,则需要将迁移过程中的问题处理等内容整理成迁移报告,以便后续正式迁移时,可以快速解决问题,完成迁移工作。
- 按照上线优化脚本进行参数优化(注意参数PK_WITH_CLUSTER一定要置为0再开始迁移工作),ENABLE_MONITOR参数在迁移之后再根据需求开启,迁移过程中开启可能会影响迁移速度;
- 扩充redo日志,默认为2*256M,一般扩充为2*2048M即可,也可以按照实际情况进行调整;
- 归档迁移之前先不要开启,开启归档会产生IO操作,会影响迁移速度;
- 创建系统包SP_CREATE_SYSTEM_PACKAGES(1);避免在迁移过程中有用到系统包时报错。
- 迁移空间地理数据时需要开启达梦端的DMGEO包,使用SP_INIT_GEO_SYS(1)命令开启,迁移时需要单独处理。
DTS版本的选择,建议选择和目的端达梦库接近的dts版本;