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

news/2025/2/25 2:39:58

本文章使用的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迁移表(约束索引)

adbdf7ff76619d72a5.png" alt="" />

以上就是表的约束索引的迁移,遇到报错时,可将报错的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
BEGIN
 NEW."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.17UNSIGNED语法分析出错

老版本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/1EM7Hy85YEkpGc6pghe7qwwpwd=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.niftyadmin.cn/n/5864931.html

相关文章

Pytorch使用手册-音频 I/O(专题十八)

音频输入/输出 本教程展示了如何使用TorchAudio的基本输入/输出(I/O)API来检查音频数据,将其加载到PyTorch张量中,并保存PyTorch张量。 警告 在最近的版本中,音频输入/输出进行了多个计划或已实施的更改。有关这些更改的详细信息,请参考“Dispatcher 介绍”。 import to…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

使用Socket编写超牛的http服务器和客户端(一)

实现一个高性能的基于 IOCP(I/O Completion Ports)的 HTTP 服务器,支持多线程、动态线程池调整和路由处理。 主要功能和特性 IOCP 模型: 使用多个 IOCP 句柄(IOCP_COUNT),将客户端连接均匀分配到不同的 IOCP 上,减少线程竞争。 工作线程使用 GetQueuedCompletionStatu…

短剧源码搭建部署海外短剧系统

随着海外短剧市场的蓬勃发展,越来越多的企业和个人希望搭建自己的短剧平台,以满足全球用户的需求。本文将详细介绍如何使用PHP开发、搭建、部署并上线一个海外短剧系统。整个过程将涵盖需求分析、技术选型、系统架构设计、开发流程、测试、部署以及上线后…

前端八股——HTML+CSS

前端八股:HTMLCSS 说明:个人总结,用于个人复习回顾,将持续改正创作,已在语雀公开,欢迎评论改正!

【行业解决方案篇十二】【DeepSeek教育科技:个性化学习路径推荐】

开篇:当AI成为私人导师 你可能不知道,现在北京某重点中学的数学课,同一个班级的30个学生每天要刷30套完全不同的练习题。这不是老师偏心,而是AI系统根据每个人的"知识漏洞"实时生成的个性方案。今天要揭秘的DeepSeek教育科技系统,就是这样一个能把"填鸭式…

【落羽的落羽 数据结构篇】顺序结构的二叉树——堆

文章目录 一、堆1. 概念与分类2. 结构与性质3. 入堆4. 出堆 二、堆排序三、堆排序的应用——TOP-K问题 一、堆 1. 概念与分类 上一期我们提到,二叉树的实现既可以用顺序结构,也可以用链式结构。本篇我们来学习顺序结构的二叉树,起个新名字—…

【redis】redis内存管理,过期策略与淘汰策略

一:Redis 的过期删除策略及处理流程如下: 1. 过期删除策略 Redis 通过以下两种策略删除过期键: 1.1 惰性删除 触发时机:当客户端访问某个键时,Redis 会检查该键是否过期。执行流程: 客户端请求访问键。…