当前位置: 首页 > news >正文

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

本文章使用的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.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;

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

相关文章:

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

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

【安卓逆向】逆向APP界面UI修改再安装

1.背景 有一客户找到我,说能不能把APP首页的底部多余界面去掉。 逆向实战 想要去除安卓应用软件中的内容,需要对APP逆向进行修改再打包。 通过工具 MIT管理器工具 提取APK包,点击apk文件,点击查看反编译apk。 搜索关键字。这里关键…...

企业级大模型应用的Java-Python异构融合架构实践

一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持: 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers(社区生态为主) 常见Python框架 …...

深度剖析数据中台架构图,铸造数字文明的基石

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/a…...

python实现基于文心一言大模型的sql小工具

一、准备工作 注册与登录: 登录百度智能云千帆控制台,注册并登录您的账号。 创建千帆应用: 根据实际需求创建千帆应用。创建成功后,获取AppID、API Key、Secret Key等信息。如果已有千帆应用,可以直接查看已有应用的AP…...

飞腾腾锐D2000 + OpenHarmony 4.1release部署deepseek大模型

简介 1.1 飞腾腾锐D2000 飞腾腾锐D2000是一款面向桌面应用的高性能通用处理,集成8个飞腾自主研发的高能效处理器核FTC663,兼 容64位ARMv8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理 指令,主…...

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块(PCB) 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序,而程序是存放在磁盘的,cpu要想执行程序的指…...

Oracle 数据库基础入门(一):搭建数据管理基石

在当今数字化时代,数据库作为数据管理的核心工具,对于各类应用系统的开发至关重要。尤其是在 Java 全栈开发领域,掌握一款强大的数据库技术是必备技能。Oracle 数据库以其卓越的性能、高度的可靠性和丰富的功能,在企业级应用中广泛…...

selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式

核心实现代码 pythonCopy Code from selenium import webdriver from selenium.webdriver.chrome.options import Options def enable_devtools_with_toggle(): options Options() # 强制开启开发者工具 options.add_argument("--auto-open-devtools-for-tabs&quo…...

分布式锁实现(数据库+Redis+Zookeeper)

1. 数据库分布式锁 实现原理 基于唯一索引: 创建一张锁表,通过唯一索引(如锁名称)保证互斥性。 加锁:插入一条记录,成功则获取锁,失败则重试。 解锁:删除对应记录。 乐观锁&…...

七、Spring Boot:初识与项目搭建

深入解析 Spring Boot:初识与项目搭建 Spring Boot 是基于 Spring Framework 的开源 Java 基础框架,旨在简化 Spring 应用的开发过程。它通过“约定优于配置”的理念,极大地减少了开发中的配置工作,同时提供了“开箱即用”的功能…...

记录一下用docker克隆某授权制定ip的环境恢复

#首先还是要看日志根据问题去进行调整 java web的老项目配置文件一般是 bin启动里边的脚本 还有conf中的 xml配置文件 再或者就是classes中的配置文件,再或者就是lib中的jar包中的配置文件 1.安装docker 2.创建docker网络 docker network create --driver bridge --subnet…...

【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...

主流虚拟化技术讲解

目录 VMware vSphere Microsoft Hyper-V KVM(Kernel-based Virtual Machine) OpenStack VMware vSphere 架构与组件:VMware vSphere 是基于裸金属虚拟化技术的平台,核心组件包括 ESXi 主机和 vCenter Server。ESXi 是虚拟化层…...

java开发——为什么要使用动态代理?

举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...

kotlin 知识点一 变量和函数

在Kotlin中定义变量的方式和Java 区别很大,在Java 中如果想要定义一个变 量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表 示b是一个字符串变量。而Kotlin中定义一个变量,只允许在变量…...

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下,LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT,通常是图像格式的 LUT 文件。下面,我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换(不是8x8网络)&am…...

侯捷 C++ 课程学习笔记:类的声明与构造函数

目录 一、类的声明 二、内联函数 三、访问级别 四、构造函数 五、构造函数重载 六、实际应用案例 七、学习心得 一、类的声明 类的声明是定义类的基本结构,包括类的成员变量和成员函数。类的声明分为类头和类体两部分。 类头(class head&#xf…...

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…...

MongoDB 数据库简介

MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载: 情况一:如果谷歌应用商店可以打开,那么就直接到谷歌应用商店下载,直接搜索vue.js.devtools添加扩展即可。 情况二:谷歌浏览器的谷歌应用商城打不开,那么就百度搜索极简插件找到vue.js.…...

Android AOSP系统裁记录

Android 系统裁剪是指根据需求移除不必要的组件和功能,以优化系统性能、减少存储占用或满足特定设备需求。以下是 Android 系统裁剪的基本步骤: 1. 准备环境 操作系统:推荐使用 Ubuntu 或 macOS。 工具: Android SDK Android N…...

Could not download npm for node v14.21.3(nvm无法下载节点v14.21.3的npm)

场景描述:之前的项目用的是node以前的版本,使用nvm没下载下来,npm命令执行不了 错误如下图,15版本的node同理,下载的都是.exe可执行文件的扩展名,使用npm命令终端无法识别 解决思路:去node官网…...

React进阶之React核心源码解析(三)

React核心源码解析 diff多节点比较diff两轮遍历比较第一轮比较第二轮比较Update 状态更新Concurrent Modediff 多节点比较diff isArray方法比较 节点更新// 更新前 <ul><li key="0" className="before">0<li><li key=...

2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务

前言&#xff1a; 关于EO边缘安全加速平台服务 参照&#xff1a;产品概述,具体如下&#xff1a; 边缘安全加速平台 EO&#xff08;Tencent Cloud EdgeOne&#xff0c;下文简称为 EdgeOne&#xff09;是国内首款基于全新架构的真正一体化的边缘安全加速平台。提供全面的安全防…...

Dify自定义工作流集成指南:对接阿里云百炼文生图API的实现方案

dify工作流的应用基本解释 dify应用发布相关地址&#xff1a;应用发布 | Dify 根据官方教程&#xff0c;我们可以看到dify自定义的工作流可以发布为----工具 这个教程将介绍如何通过工作流建立一个使用阿里云百炼文生图模型。 工具则可以给其他功能使用&#xff0c;如agent…...

WebSocket简单介绍 并接入deepseek

目录 什么是 WebSocket&#xff1f;工作原理&#xff1a; 为什么需要 WebSocket&#xff1f;WebSocket 的优势HTTP 和 WebSocket 的区别WebSocket 的劣势WebSocket 的应用场景WebSocket 握手过程1. 客户端发起握手请求2. 服务器响应握手请求3. 建立连接 WebSocket 事件处理WebS…...

android 新增native binder service 方式(三)

书接上回&#xff0c;继续第三种方式&#xff0c;是手动生成 service binder 的方法,项目结构 1&#xff0c;编译aidl aidl 文件保持不变&#xff0c;如何生成Bn和Bp 文件呢。 aidl -I ./libserviceaidl/aidl -h ./ -o ./ --langcpp libserviceaidl/aidl/com/test/IService.a…...

linux--多进程开发(5)--进程

进程间通讯概念 每两个进程之间都是独立的资源分配单元&#xff0c;不同进程之间不能直接访问另一个进程的资源。 但不同的进程需要进行信息的交互和状态的传递等&#xff0c;因此需要进程间通信&#xff08;IPC,inter processes cimmunication) 进程通信的目的&#xff1a; …...

分享httprunner 结合django实现平台接口自动化方案

说明&#xff0c;可以直接在某个视图集定义自定义接口来验证。 调试1&#xff1a;前端界面直接编写yaml文件. 新增要实现存数据到mysql&#xff0c;同时存文件到testcase下, 如test.yaml 更新yaml数据&#xff0c;同时做到更新 testcase下的文件&#xff0c;如test.yaml acti…...

前端面试题之HTML篇

1.src和href的区别 src用于替换当前元素&#xff0c;href用于在当前文档和引用资源之间确立联系。 src可用于img、input、style、script、iframe---同步加载执行 href可用于link、a---异步 1.用途不同 src 用于引入外部资源&#xff0c;通常是图像、视频、JavaScript 文件等&am…...

Selenium 调用模型接口实现功能测试

要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...

java后端开发day18--学生管理系统

&#xff08;以下内容全部来自上述课程&#xff09; 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性&#xff1a;id&#xff0c;姓名&#xff0c;年龄&#xff0c;家庭住址 3.添加功能 键盘录入每一个学生信息并…...

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【DeepSeek】【GPT-Academic】:DeepSeek集成到GPT-Academic(官方+第三方)

目录 1 官方deepseek 1.1 拉取学术GPT项目 1.2 安装依赖 1.3 修改配置文件中的DEEPSEEK_API_KEY 2 第三方API 2.1 修改DEEPSEEK_API_KEY 2.2 修改CUSTOM_API_KEY_PATTERM 2.3 地址重定向 2.4 修改模型参数 2.5 成功调用 2.6 尝试添加一个deepseek-r1参数 3 使用千帆…...

生成对抗网络(GAN):让机器学习“创造”新世界

目录 引言 什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f; GAN的核心原理 GAN的损失函数 GAN的变种 1. 条件生成对抗网络&#xff08;Conditional GAN, cGAN&#xff09; 2. 深度卷积生成对抗网络&#xff08;DCGAN&#xff09; 3. 生成对抗网络的 Wassers…...

JavaScript系列(87)--Webpack 高级配置详解

Webpack 高级配置详解 &#x1f6e0;️ Webpack 是前端工程化中最流行的构建工具之一&#xff0c;掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 &#x1f31f; &#x1f4a1; 小知识&#xf…...

48.日常算法

1.面试题 03.06. 动物收容所 题目来源 动物收容所。有家动物收容所只收容狗与猫&#xff0c;且严格遵守“先进先出”的原则。在收养该收容所的动物时&#xff0c;收养人只能收养所有动物中“最老”&#xff08;由其进入收容所的时间长短而定&#xff09;的动物&#xff0c;或…...

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…...

Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现

基于四元数与滑模控制的卫星姿态控制 一、基本原理 1. 四元数姿态表示 四元数运动学方程&#xff1a; 3. 滑模控制设计 二、代码实现&#xff08;Python&#xff09; 1. 四元数运算工具 import numpy as npdef quat_mult(q1, q2):"""四元数乘法""…...

MongoDB学习

MongoDB 是一种流行的 NoSQL 数据库&#xff0c;以文档存储为核心&#xff0c;适用于高灵活性、高扩展性的场景。本文将从基础概念到实际应用&#xff0c;带你快速掌握 MongoDB 的核心操作。 1. MongoDB 简介 什么是 MongoDB&#xff1f; MongoDB 是一个基于分布式文件存储的…...

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面&#xff1a; 基础知识和技能培训 &#xff1a; 法律法规 &#xff1a;学习水利工程相关的安全生产法律法规&#xff0c;了解安全生产标准及规范。 事故案例 &#xff1a;通过分析事故案例&#xff0c;了解事故原因和教训&#x…...

九、数据治理架构流程

一、总体结构 《数据治理架构流程图》&#xff08;Data Governance Architecture Flowchart&#xff09; 水平结构&#xff1a;流程图采用水平组织&#xff0c;显示从数据源到数据应用的进程。 垂直结构&#xff1a;每个水平部分进一步划分为垂直列&#xff0c;代表数据治理的…...

Spring boot中的@ConfigurationProperties注解

Spring boot中的ConfigurationProperties注解 ConfigurationProperties 是 Spring Boot 提供的一个强大注解&#xff0c;用于将配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的配置绑定到一个 Java 对象中。它不仅简化了配置管理&#xff…...

04性能监控与调优篇(D2_JVM调优⼯具)

目录 学习前言 讲解一&#xff1a;理论篇&#xff08;深入理解JVM第三版&#xff09; 一、虚拟机性能监控、故障处理工具 1. 基本介绍 2. 基础故障处理工具 jps&#xff1a;虚拟机进程状况工具 jstat&#xff1a;虚拟机统计信息监视工具 jinfo&#xff1a;Java配置信息工…...

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

OkHttp、Retrofit、RxJava:一文讲清楚

一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口&#xff0c;代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式&#xff1a; enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…...

AI前端加速科学研究:ScriptEcho赋能科研新纪元

科学研究正面临前所未有的挑战。数据以前所未有的速度爆炸式增长&#xff0c;研究课题也变得日益复杂。如何高效地处理海量数据、构建复杂模型、并将其转化为有意义的结论&#xff0c;成为摆在科研人员面前的一道难题。传统的科研模式往往需要耗费大量的时间和精力在数据处理、…...

从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?

本文首发&#xff1a;从零到一&#xff1a;如何用阿里云百炼和火山引擎搭建专属 AI 助手&#xff08;DeepSeek&#xff09;&#xff1f; 阿里云百炼和火山引擎都推出了免费的 DeepSeek 模型体验额度&#xff0c;今天我和大家一起搭建一个本地的专属 AI 助手。  阿里云百炼为 …...

ChatGPT背后的理论基础:从预训练到微调的深度解析

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台GPT-4o-mini模型生成&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 随着人工智能特别是自然语言处理技术的飞速发展&#xff0c;ChatGPT作为一种强大的对话…...