达梦DTS数据迁移工具生产篇(MySQL->DM8)

article/2025/7/6 22:31:07

本文章使用的DTS工具为 2024年9月18日的版本,使用的目的端DM8数据库版本为2023年12月的版本,注意数据库版本和DTS版本之间跨度不要太大,以免出现各种兼容性的报错。若发现版本差距过大时,请联系达梦技术服务工程师处理。

1. 迁移前检查

  • 目的端DM8的页大小,要与源端MySQL库大一级档,未知时建议用16~32K。
  • 目的端DM8的字符集编码,要与源端一致,uft-8或utf-8mb4的统一用utf-8,gbk或其他类型gbk的统一用GB18030,初始化参数CHARSET决定,MySQL迁移基本上使用CHARSET=1。
  • 目的端DM8的空格检索建议关闭,或者在MySQL新建表,插入数据'AA'和'AA ',其中第二个AA末尾带有一个空格,然后查询where name='AA',若第二个带空格的AA出现,则空格检索保持关闭即可,初始化参数BLANK_PAD_MODE=0决定。
  • 目的端DM8的大小写敏感,一般是关闭,主要敏感的是数据而不是对象,可以在MySQL新建表并插入数据aA和aa,然后查询where name='aa',若aa和aA能同时查出来,则大小写敏感就要关闭,或者与开发人员沟通这样的结果是否为他们需要的,由初始化参数CASE_SENSITIVE=0决定。
  • 目的端DM8的dm.ini修改参数COMPATIBLE_MODE=4

CASE_SENSITIVE,为DM8初始化参数,意思是“大小写敏感”,1为开启,0为关闭,默认为1,初始化数据库时配置,一旦配置后无法修改,只能铲库重新初始化。参数其具体作用如下:

  • 开启大小写敏感时,数据库会将执行的sql中所有小写都转为大写再执行,并且数据aa和aA是不相同的。
  • 关闭大小写敏感时,数据库不会将sql中的小写转为大写(小写只能查小写,大写只能查大写),并且数据aa和aA是相同的(插入唯一列时aa和aA会报错违反唯一约束)。

那选择开启还是关闭才最接近MySQL的使用习惯呢?

  • 首先要确定数据的敏感性,若aa和aA都需要被查出来,或者被查出来但是不影响业务,那么开启和关闭无所谓,反之则必须开启/或必须关闭。
  • 若大小写敏感为关闭,则在DM8中创建的表(包括表中的列名)、视图、函数、存储过程等等对象,名称需要与源库MySQL保持完全统一,否则就会查不出来,比如在DM8中创建表PRODUCTS,则select * from products就会报错没有[products]这个对象,要改为select * from PRODUCTS才能正常查出来(开发人员可以改代码适配,但,你懂的……)。
  • 若大小写敏感为开启,则在DM8中创建的所有对象,名称均改为大写,这样的目的是适配MySQL的使用习惯,因为执行的SQL不管是大写还是小写,都能查到,比如在DM8中创建表PRODUCTS,则select * from products也可以查到该表(大写也能),因为DM8会自动将执行的SQL转为大写后,再执行。若有时真的需要创建小写的表名怎么办?为名称加双引号即可,同时查的时候也要加双引号。
  • 大小写敏感开启时,可能会遇到一个问题,我不希望把所有名称都设置为大写,我想大小写穿插使用,比如表名是A_users,或者列名是custerID,该怎么办呢?若真有这种需求,请与开发人员沟通清楚为何有这样的需求?因为这会带来运维工作难度,当开发人员确认需要该需求,则告知他们,大小写穿插的名称需要加双引号才能使用,比如select "custerID" from "A_users",新建表时大小写穿插的名称,也需要双引号扩起才能创建出来。

综上,在迁移时必须明确好“大小写敏感”的参数配置,否则会出现各种问题,甚至重新迁移。

补充:上文提到的双引号,其实就是MySQL的反引号(即键盘TAB键上方的那个按键,~符号下方的那个符号),开发人员只需要将反引号替换为双引号即可适配。

老用户可能还有疑惑,为何没有参数 LENGTH_IN_CHAR ?这个在后续迁移时有讲,若你使用的DM8还拥有该参数,这里不建议开启,原因后续迁移时也有说明。

2. 准备工作 

目的端DM8创建好对应的表空间、用户,名称与源库一致。这里如果你是MySQL使用人员,未使用过DM8或Oracle,则可能会比较疑惑,在下方解释一下,用过的人创建好表空间、用户后直接下一章节。

        首先MySQL是以“库”为单位(即database),库中有表、视图、存储过程等等对象,然后再创建一个用户让它访问这个库的所有对象权限,我们使用MySQL时只需连接该用户,创建表时都往该库创建即可。那DM8是以“用户”为单位(即user),表、视图、存储过程等等对象,均属于某个user,使用DM8时也是一样,只需连接到该user,即可使用这些对象。

        那你可能有疑惑,我MySQL可是有多个库的,我一个user拥有多个库的权限,在DM8怎么实现?很简单,首先创建一个与MySQL同名的user,然后再新建模式(即schema),MySQL有多少个库,就新建多少个同名的模式,然后,将不同库下的对象,分别迁移到对应名称的模式下,连接DM8时只需连接该user即可,查询方式跟MySQL相同,都是在对象名前面加上“库名.”(DM8是模式名.),那MySQL有use database xxx,在DM8这边是SET SCHEMA xxx(大小写不限)。

        那你可能还有疑惑,“模式”(即schema)是什么?首先它不是database,在DM8中database其实是表空间(我个人觉得),模式是表空间里对象的映射,举个例子说明:表空间就是一个图书馆,里面有书、画册、典籍等(相当于表、视图、存储过程等),这些书籍(对象)散落在图书馆里的各个架子上,为了记录这些东西放在哪,有个笔记本专门记录位置,这个笔记本就是“模式”(schema),它只是每个书籍(对象)的映射而已。一部分书是某个好心人(user)出借给图书馆的,那这些书属于这个user。但图书管理员(supser_user)是这个好心人他爸,虽然书不是它的也不是其他user的,但他有权处理这些书,把这些书放到其他user的书架上,使这些书属于其他的user,大致就是这样。

2.1 创建表空间

生产环境,每个用户需要创建2个表空间,一个用于存放数据,一个用于存放索引。表空间条件满足如下:

  • 每个文件大小size设置为128;
  • 自动扩充打开;
  • 扩充尺寸不写,扩充上限配置为102400或204800(即100G/200G),具体根据磁盘空间确定,存放索引的表空间可以配置为51200;
  • 生产环境要求存放数据的表空间最少配置4个表空间文件,若磁盘空间不足时,可将扩充上限配置为51200,甚至20480均可,不够用时再添加新文件;
  • 生产环境要求索引表空间最少配置2个表空间文件,若磁盘空间不足时,可将扩充上限配置为20480,甚至10240,不够用时再添加新文件。

示例:


--数据表空间
create tablespace "TEST_DAT" datafile 'TEST_DAT01.DBF' size 128 autoextend on maxsize 102400 CACHE = NORMAL;--索引表空间
create tablespace "TEST_IDX" datafile 'TEST_IDX01.DBF' size 128 autoextend on maxsize 51200 CACHE = NORMAL;

2.2 创建用户

生产环境创建用户,必须配置表空间、索引表空间。

示例:

--创建普通用户TEST
create user "TEST" identified by "TEST123456" password_policy 31
default tablespace "TEST_DAT" --对应上方的数据表空间
default index tablespace "TEST_IDX"; --对应上方的索引表空间grant "PUBLIC","RESOURCE","SOI","VTI" to "TEST"; --这是基础授权,其中RESOURCE角色权限是创建常用对象、写数据的权限
grant CREATE SESSION to "TEST";  --必给,不然创建不了会话--TEST是用户名,TEST123456是密码
--default tablespace "TEST_DAT" 是该用户默认使用的数据表空间
--default index tablespace "TEST_IDX" 是该用户默认使用的索引表空间
--password_policy 31是密码策略,不写时默认使用系统统一策略
/* 
0: 无策略;
1: 禁止与用户名相同;
2: 口令长度不小于 9;
4:至少包含一个大写字母(A-Z);
8 :至少包含一个数字(0-9);
16:至少包含一个标点符号(英文输入法状态下,除―和空格外的所有符号);
若为其他数字,则表示配置值的和,如 3=1+2,表示同时启用第 1 项和第 2 项策略,31就是全部启用。当COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0 
*/

2.3 创建模式(可选操作)

 若开发人员要求模式名必须小写,或需要1个用户拥有多个DB的权限,则就需要手工创建出对应的模式名。

注意:大小写敏感开启时,非常不建议将模式名创建为小写

示例:

--创建模式,且该模式属于TEST用户
CREATE SCHEMA "zhurong" AUTHORIZATION "TEST";--zhurong是模式名,如果是小写,需要双引号扩起
--TEST是用户名--补充:A用户拥有A模式时,A用户拥有A模式的所有权限

3. 开始迁移

3.1 新建工程

如上图,如果没有“数据库版本”选项,则可能你使用的DTS版本较低,这不影响,直接正常连接即可。

如上图,这步骤其实就是连接MySQL了,可能会遇到各种报错,请记住DTS工具本质是通过JDBC连接的MySQL,所以相当于是JDBC连接报错,处理手法与JDBC连接失败是一致的。

如上图,这步骤是可选操作,一般情况下DTS自带的JDBC驱动包能连接大部分版本的MySQL,但有时也会无法连接,或连接上了但是迁移出现少数据、少字段、数据有错误等问题,所以DTS工具允许使用其他途径获取到的JDBC驱动包。驱动包获取途径见下方。

补充说明:DTS工具连MySQL其实是使用JDBC的方式连接,所以需要jdbc驱动包,连接串url也跟寻常的java应用服务相同,所以即使你的DTS工具为较低版本,实际也能连接各种MySQL库。

jdbc驱动包获取途径:

(1)在MySQL官网获取

(2)找业务开发让他们从java应用服务包里获取,一般在lib目录下

以上,均没问题后,下一步

如上图,这里可以使用SYSDBA用户,但也可以使用2.2章节创建的用户。

如上图,这里涉及一个老问题,MySQL是以“字符为单位”,比如汉字,1个汉字就是1个字符,我想在MySQL的A表的name列,写10个汉字,则name列的精度为varchar(10),即可存入10个汉字,这就是以“字符为单位”。那DM8是以“字节为单位”的,1个汉字就是1个字符,在字符集为UTF-8时占用3字节(生僻字可能4字节),所以name列需要设置varchar(30)才能存下10个汉字,这就是以“字节为单位”。上图的这个配置,就是实现以“字符为单位”这个功能的,并且还需要告知开发人员,后续建表时,注意将插入汉字的列,其精度扩2~3倍后,再在DM8上创建。

补充:字符集为GBK时汉字的长度是2字节,生僻字可能是3字节。

上图中可选长度2,后续报错再处理即可。

        这里DM8的老用户可能有疑惑,DM8的初始化参数中,有一个参数叫LENGTH_IN_CHAR,即“varchar和varchar2类型是否以字符为单位”,开启后,建表时若写varchar(10)时,执行的时候数据库会自动扩3倍再执行,即执行后的结果为varchar(30),这样的话,这里DTS迁移就不用选择字符长度了。

        但 LENGTH_IN_CHAR 参数因为开启后会衍生出各种问题,且无法关闭,达梦公司综合考虑后将其删除,在2024年7月及之后的DM8版本中不再有该参数,所以有了这里的步骤。

        那你使用的DM8是旧版本,拥有该参数,是否可以在初始化时开启呢?这里回答是不建议,主要原因是开启后无法关闭,且为了防止一些无脑的开发或DBA找茬,增加你重建库和迁移数据的工作量(有时甚至要求你当天必须迁移完所有数据然后被迫通宵),最好就是不开启,使用DTS规避该问题,并使用“批量调整varchar精度”脚本配合处理,该脚本见章节xxx。

如上图,以上配置均完成后,下一步

 

3.2 迁移表

迁移表,分三步,先结构,再数据,最后才是索引约束

以上就是表结构的迁移,遇到报错时,可将报错的sql复制后,在manager管理工具执行,查看报错情况,一般是语法不兼容需要改写,可查看本文章末尾“常见报错”寻找对应报错处理,或联系达梦工程师查看。

3.3 迁移表(表数据)

以上就是表数据的迁移,遇到报错时,可将报错的sql复制后,在manager管理工具执行,查看报错情况,最常见的可能是时间格式错误,或者违反唯一约束、java内存溢出等,可查看本文章末尾“常见报错”寻找对应报错处理,或联系达梦工程师查看。

注意:这一步要重点关注时间列的数据情况

3.4 迁移表(约束索引)

以上就是表的约束索引的迁移,遇到报错时,可将报错的sql复制后,在manager管理工具执行,查看报错情况,最常见的是违反唯一性约束,这种都是有重复数据导致唯一键创建失败,可查看本文章末尾“常见报错”寻找对应报错处理,或联系达梦工程师查看。

至此,迁移表结束。

3.5 迁移视图

若这一步骤为空,什么都没有显示,表示该Oracle源库没有视图,直接跳过本章节。

可选操作的补图,如下:

以上就是视图的迁移,遇到报错时,可将报错的sql复制后,在manager管理工具执行,查看报错情况,一般是语法不兼容需要改写,可查看本文章末尾“常见报错”寻找对应报错处理,或联系达梦工程师查看。

3.6 迁移存储过程/函数

若这一步骤为空,什么都没有显示,表示该Oracle源库没有视图,直接跳过本章节。

以上就是存储过程与函数的迁移,遇到报错时,可将报错的sql复制后,在manager管理工具执行,查看报错情况,一般是语法不兼容需要改写,可查看本文章末尾“常见报错”寻找对应报错处理,或联系达梦工程师查看。

3.7 迁移触发器

如上图,若这一步骤为空,什么都没有显示,表示该Oracle源库没有视图,直接跳过本章节。

若有,则迁移方式与视图、存储过程相同,照做即可。

4. 常见报错

更多报错处理方案见达梦在线服务平台:从 MySQL 迁移到 DM | 达梦技术文档

4.1 记录超长

这个是数据太长导致,数据库是以页为单位作为存储,初始化参数中的页大小决定一条数据的大小,当数据的大小超出时就会报错。
解决方案:
(1)可以启用超长记录

alter table 表名 enable using long row ;

打开后,一条记录的页的存储空间就不会受限制。但是要注意,若插入数据的列有索引,则可能会报错,反之,插入后再给这个列创建索引时也可能会报错。

(2)提高页大小,但初始化库后页大小不能修改,所以只能新初始化一个库,将页大小设置高一些再迁移数据,一般存储不紧张时,且数据较大时,建议用32k页大小,因此迁移前尽量保证页大小与源库相同。

 4.2 非法的基类名XXX

这个报错是迁移的对象中,引用了源库自带的系统函数或存储过程,在DM中没有同名时导致。或者是该系统函数或存储过程,在源库中属于模式A,但在DM中属于模式B,通过修改DDL把A成B也可以。
解决方案:
可以查询DM8的手册,找到对应功能的存储过程或函数,将迁移对象的DDL改写,或创建同名的公共同义词。手册见数据库安装目录的doc目录下,或在达梦在线服务平台查找:函数 | 达梦技术文档

4.3 XXX附近存在错误/语法分析错误

这个报错是迁移对象的DDL中XXX处的SQL写法,与DM8不一致导致,需要将对象的DDL进行改写。常见的有使用了MySQL特有的语法但DM不支持,所以报错那部分写法存在错误。

第二种情况是SQL中有关键字,比如percent,这时需要将关键字用双引号括起并改为大写,或者将关键字添加到屏蔽参数里,如下:
(1)可以在dm_svc.conf中添加KEYWORDS参数,并使用服务名连接数据库。
(2)登录数据库执行sp_set_para_string_value(2,'EXCLUDE_RESERVED_WORDS','关键字大写'); ,若为集群,则集群中每个节点都要执行,需要重启数据库才能生效。

 4.4 无效的过程/函数名

这个报错是迁移的对象引用了源库的系统函数或存储过程,且DM8正好有同名同功能的函数或存储过程,但是参数位置、数量可能不相同,导致的报错,需要将对象的DDL进行改写。 手册见数据库安装目录的doc目录下,或在达梦在线服务平台查找:函数 | 达梦技术文档

4.6 无法解析的成员访问表达式XXX

这个报错是迁移对象的DDL中XXX处的SQL写法,与DM8不一致导致,与4.3章节有点像,也是需要将对象的DDL进行改写,比如,将USERENV('LANG')改为SYS_CONTEXT('USERENV','LANG')。

4.7 被引用表[XXXX]不存在

MySQL端XXXX表不存在,需要联系开发人员沟通为何少表;或者是你遗漏了该XXXX表的迁移,正常迁移XXXX表并重新进行本次报错迁移即可。该报错常见于创建外键时。

4.8 被引用表[XXXX]引用索引不存在

该报错常见于迁移索引约束,比如表的主键是复合主键(2个列),要为其中一个列创建唯一索引,就能用它做外键

示例:

--表PROCESSINSTANCEINFO要为列INSTANCEID创建一个外键,那么需要先为该INSTANCEID列创建一个唯一键,才能创建外键。CREATE OR REPLACE UNIQUE  INDEX "PSD_BPM"."IDX_INSTANCEID" ON "PSD_BPM"."PROCESSINSTANCEINFO"("INSTANCEID" ASC) STORAGE(ON "PSD_BPM", CLUSTERBTR) ;ALTER TABLE "PSD_BPM"."EVENTTYPES" ADD FOREIGN KEY("INSTANCEID") REFERENCES "PSD_BPM"."PROCESSINSTANCEINFO"("INSTANCEID");

4.9 表上只允许给一个列设置ON UPDATE

顾名思义,因为on update语法是MySQL独有的触发器,那MySQL允许一张表上为多个列创建触发器,DM8也可以,但MySQL写法on update在单张表只支持设置1次,要解决这个问题,可以先自己查一下MySQL报错表的DDL语句,看下触发器是否难改,若太难改可联系开发人员处理。

示例:

/*经过观察,这张表的触发器是,为CERT_APPLY_TIME、DATA_OPER_TIME这2个列,创建一个自动插入数据的
功能,当有新数据插入时,列CERT_APPLY_TIME要将当前系统时间作为数据写入该新增数据中,当数据变更时,
DATA_OPER_TIME列也要将当前系统时间写入,即创建时间和修改时间的自动生成功能,那么就可以通过手工创
建DM8的触发器实现,如下:
*/create OR REPLACE  trigger "NER_CUST"."TRG_C_CERT"
before UPDATE on "NER_CUST"."C_CERT" --当发生变更操作时
for each ROW
BEGINNEW."CERT_APPLY_TIME" :=SYSDATE; --将系统时间写入NEW."DATA_OPER_TIME" :=SYSDATE; --将系统时间写入END;

4.10 违反引用约束[CONSXXXXXX]

MySQL那边XXXX表的XX列有大量重复数据,该问题需要开发判断是否需要创建外键。

可以使用以下SQL排查:

--查看数据重复
select 列1,count(*) from "表名大写" group by 列1 having count(*) > 1;--这里的列1,来源于报错“违反XXX唯一性约束”里的列,XXX是约束名称,找到这个约束并查看它是对哪个列配置的,即可得知列1是哪个列名。

多个列时,select后面写多个列,但最后别忘了加上一个count(*),group by处与select处相同,只是不含count(*)。源库、目的库都执行排查。

4.11 无效的列

常见于分区表迁移,需要做语法改写,可联系开发人员处理。

示例:

--分区键的表达式为MySQL特殊语法,需要改表结构DDL,改为间隔分区表,按月分区CREATE TABLE "zhurong"."AAAA"
("ID" VARCHAR(152) NOT NULL,"AA_ID" VARCHAR(380) NOT NULL,"LOG_AA_TIME" TIMESTAMP(0) NULL,"AA_NAME" VARCHAR(800) NULL,"AA_NAME_ALIAS" VARCHAR(800) NULL,"AA_GROUP" VARCHAR(800) NULL,"AA_GROUP_ALIAS" VARCHAR(800) NULL,"AAT_URL" VARCHAR(8000) NULL,"LOG_AA" VARCHAR(16000) NULL,"PARTITION_CREATE_DATE" DATE DEFAULT '1970-01-01'NOT NULL
)PARTITION BY RANGE("PARTITION_CREATE_DATE")
INTERVAL (NUMTOYMINTERVAL(1,'month'))
(PARTITION "P202101" VALUES LESS THAN (TO_DATE('2021-01-01','yyyy-mm-dd'))
,PARTITION "P202102" VALUES LESS THAN (TO_DATE('2021-02-01','yyyy-mm-dd'))
,PARTITION "P202103" VALUES LESS THAN (TO_DATE('2021-03-01','yyyy-mm-dd'))
,PARTITION "P202104" VALUES LESS THAN (TO_DATE('2021-04-01','yyyy-mm-dd'))
,PARTITION "P202105" VALUES LESS THAN (TO_DATE('2021-05-01','yyyy-mm-dd'))
,PARTITION "P202106" VALUES LESS THAN (TO_DATE('2021-06-01','yyyy-mm-dd'))
,PARTITION "P202107" VALUES LESS THAN (TO_DATE('2021-07-01','yyyy-mm-dd'))
,PARTITION "P202108" VALUES LESS THAN (TO_DATE('2021-08-01','yyyy-mm-dd'))
,PARTITION "P202109" VALUES LESS THAN (TO_DATE('2021-09-01','yyyy-mm-dd'))
,PARTITION "P202110" VALUES LESS THAN (TO_DATE('2021-10-01','yyyy-mm-dd'))
,PARTITION "P202111" VALUES LESS THAN (TO_DATE('2021-11-01','yyyy-mm-dd'))
,PARTITION "P202112" VALUES LESS THAN (TO_DATE('2021-12-01','yyyy-mm-dd'))
,PARTITION "MAX" VALUES LESS THAN (TO_DATE('2022-01-01','yyyy-mm-dd'))
)

4.12 对象[XXXX]DEFAULT约束表达式无效

常见于索引约束迁移,将列XXXX列的精度调高,比如CHAR(5)改为CHAR(15),可咨询开发人员评估。

4.13 此列列表已有索引

常见于索引约束迁移,MySQL支持同一个列创建多个索引(复合索引除外),但DM8不允许,因为这会导致出现冗余索引,所以当一个列有索引后,再为该列创建索引就会报这个错误,不需要处理,直接忽略该报错。

4.14 在表"AAA"."XXXX"上添加外键约束xxxx

常见于索引约束迁移,A模式的X表引用了B模式的Y表做外键导致,解决方法是,将报错的SQL语句复制出来,然后手工加上模式名,再DM8上执行即可。

示例:

--在REFERENCES的后面加上模式名即可
ALTER TABLE "XXXX"."xxxx" ADD FOREIGN KEY("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP") REFERENCES "XXXX"."xxxx"("SCHED_NAME","TRIGGER_NAME","TRIGGER_GROUP");

4.15 [AUTO_INCREMENT]附近出现错误: 语法分析出错

这是老版本DM8不兼容MySQL的AUTO_INCREMENT写法,从而报的错误,可以直接复制报错的建表DDL语句,将引用AUTO_INCREMENT的列,改写为DM8的自增列,IDENTITY(1, 1),这里1是初始值,第二个1是下一次的值,可以通过表结构末尾的AUTO_INCREMENT获得下一个的值。改写好后,删掉AUTO_INCREMENT语法,创建表即可,但注意,这些表需要重新迁移注释、索引约束。

或者,升级DM8到2023年11月及之后的版本。

4.16 列[XXXX]长度超出定义

将varchar类型的精度,扩充2~3倍,比如数据类型VARCHAR(10)改为VARCHAR(30)。

4.17 UNSIGNED语法分析出错

老版本DM8可能报错,把报错的建表DDL语句复制出来,直接将UNSIGNED子句删除,然后手工在DM8上建表,但注意,这些表需要重新迁移注释、索引约束。

4.18 无效的数据类型

可能是数据类型不兼容,比如TINYINT,TINYINT(1)数据类型改为TINYINT,把报错的建表DDL语句复制出来后,修改好,手工在DM8上建表,但注意,这些表需要重新迁移注释、索引约束。

4.19 不支持该数据类型

常见于时间类型数据,时间列内容多了一个 T,比如'2021-04-08T16:44:40',是驱动导致,最常见于MySQL5.7使用了版本为8的jdbc驱动导致,有时MySQL8使用8的jdbc驱动也会遇到,目前经过测试,mysql-connector-java-5.1.49.zip 这个版本的驱动没有这个问题。

通过网盘分享的文件:JDBC驱动
链接: https://pan.baidu.com/s/1EM7Hy85YEkpGc6pghe7qww?pwd=cxcd 提取码: cxcd

4.20 非法 IDENTITY 列类型

因为MySQL也有自增函数identity,与DM8同名,但DM8只支持int和bigint类型,其他类型会报错,可以把报错的建表DDL语句复制出来后,修改好,手工在DM8上建表,但注意,这些表需要重新迁移注释、索引约束。

5. 数据对比

这里是手工对比,DTS工具现已支持数据对比,只要会使用迁移功能,对比功能自然也会,但实际使用起来可能会有些许问题,不嫌麻烦可以尝试以下手工对比:

执行以下SQL,会打印出对比的SQL,将其全部复制出来后,再执行,即可得到源库与新库的数据情况,粘贴到EXCEL里进行对比即可。

--表数据
select 'select count(*) from '||owner||'.'||table_name||' union all' from all_tables where owner='模式名大写' order by table_name asc;--注意将复制出来的sql里,最后一条sql末尾的union all删掉,改为分号即可--视图
select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='VIEW' order by 1,2,3 asc;--函数
select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='FUNCTION' order by 1,2,3 asc;--存储过程
select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='PROCEDURE' order by 1,2,3 asc;--触发器
select owner,object_name,status from all_objects where owner='模式名大写' and object_type ='TRIGGER' order by 1,2,3 asc;

 当发现数据不一致时,或者数据有重复时,可以使用以下SQL排查:

--查看数据重复
select 列1,count(*) from "表名大写" group by 列1 having count(*) > 1;

社区地址:快速上手 | 达梦技术文档


http://www.hkcw.cn/article/DeOPagkTdU.shtml

相关文章

MySQL 数据库备份与还原

作者:IvanCodes 日期:2025年5月18日 专栏:MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯 备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进…

MySQL Binlog 日志查看方法及查看内容解析

一、Binlog 日志概述 Binlog(二进制日志)记录了 MySQL 数据库执行的所有更改数据的操作,包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。 二、查看 Binlog 日志方法 开启 Binlog 日志功能 默…

【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析

随着企业信息化和数字化转型的加速,企业对数据库的要求不仅仅局限于基础的数据存储功能,更涉及到性能、可扩展性、安全性、以及持续的系统升级能力。因此,数据库迁移已经成为现代企业升级IT架构时的一个重要步骤。特别是在国产化替代的浪潮中…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例Delete删除数据语法案例截断表语法案例插入查询结果语法案例聚合函数函数介绍案例group by子句的使用语法having和where案例结语Update 语法 UPDATE …

MySQL开大招了! 三十周年庆典推出四项 OCP 认证免费

🎉 MySQL 30岁生日大礼包!OU掏家底了! 狠心决定:4.20-7.31期间 🔥全系列MySQL课程四大认证 🔥原价$2,500/人的考试资格 通!通!免!费! 💡30年只此一…

Kettle9.1链接mysql报错: Connection failed. Verify all connection parameters and confirm that the appropr

Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value ‘D1’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC 连接失败。验证所…

2025最新版|八股文面试题库+答案详解(附高频考点解析)

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…

库室门禁报警系统|多功能控制器运用

库室门禁报警系统 库室门禁报警系统是一套综合性的安全防护体系,它集成了门禁控制、入侵报警、视频监控等多种功能。门禁控制功能通过对人员进出权限的精准管理,严格限制无关人员进入库室。系统可根据人员的身份、职务、工作需求等设定不同的权限&#…

【我给AI出题-1】DCMTK的storescu在发送医学图像给服务器时,能否指定客户端的端口号?

本文由Markdown语法编辑器编辑完成。 封面图像由: "即梦AI"创作,提示词: “几个AI工具,在一起激烈地讨论问题,包括: 豆包,kimi, deepseek, chatgpt, csdn的图标,作为人物形象. 可以生成吉普力的风格.” 1.…

研华工控机安装Windows10系统,适用UEFI(GPT)格式安装

主要硬件 主板:AIMB-787 、CPU:i5-6500 U盘启动工具:通过网盘分享的文件:rufus-3.20.zip 链接: https://pan.baidu.com/s/1YlFfd-_EhFHCG4sEHBQ8dQ?pwdQT12 提取码: QT12 Win10 22H2 Pro 纯净版系统:通过网盘分享…

ubuntu系统安装Pyside6报错解决

目录 1,问题: 2,解决方法: 2.1 首先查看pypi是否有你需要包的镜像: 2.2 其它方案: 2.3 如果下载很慢,可以换源: 2.4 查看系统架构 Windows Ubuntu 1,问题&#xf…

第六十一节:深度学习-使用 OpenCV DNN 模块

一、OpenCV DNN模块:传统与AI的桥梁 在深度学习席卷计算机视觉领域的今天,OpenCV作为最广泛使用的视觉库,通过其强大的DNN(Deep Neural Networks)模块架起了传统算法与深度学习之间的桥梁。该模块允许开发者在无需依赖原始深度学习框架的情况下,直接加载和运行预训练模型…

MySql(七)

目录 创建表 准备数据 1.更新表中的数据 1)不带条件修改 修改eno表中的性别为女 查看表中的数据 修改表中的性别为女 2)带条件修改 修改张三的性别为男 查看表 把地址为木星的修改为火星 一次修改多个列 删除数据 1)语法(删除表中…

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命:第四次工业革命的核心驱动力​ 在科技飞速发展的当下,我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出,这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错 cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]官…

动态规划-300.最长递增子序列-力扣(LeetCode)

一、题目解析 子数组vs子序列 回过头来,我们分析题目给出的条件,其中要注意的是严格递增这个字眼 二、算法原理 1、状态表示 我们想要知道的是最长递增子序列长度,所以dp[i]表示:以i位置元素为结尾的所有子序列中最长递增子序列…

MySQL中怎么看是否走了索引

学生表 创建普通索引 create index index_name on student (name); 1.使用EXPLAIN查看执行计划(核心) explain select * from student where name 李明 key字段:显示实际使用的索引名称。若值为NULL,表示未使用索引;若显示具体索引名&…

<< C程序设计语言第2版 >> 练习 1-23 删除C语言程序中所有的注释语句

1. 前言 本篇文章介绍的是实现删除C语言源文件中所有注释的功能.希望可以给C语言初学者一点参考.代码测试并不充分, 所以肯定还有bug, 有兴趣的同学可以改进. 原题目是: 练习1-23 编写一个删除C语言程序中所有的注释语句. 要正确处理带引号的字符串与字符常量. 在C语言中, 注释…

数据结构与算法之中缀表达式的求值

栈 栈的一个实际需求 请输入一个表达式计算式:[7*22-51-53-3]点击计算【如下图】 栈的介绍 栈的英文为stack(stack)。栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表…

显卡3080和4060哪个强 两款游戏性能对比

对于硬核玩家而言,选择一款合适的显卡至关重要。在市场上,NVIDIA的3080和4060两款显卡备受关注。很多朋友在选择时会疑惑,究竟是3080更强,还是4060更具性价比呢?今天我们就来深入分析这两款显卡,帮助大家做…