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

【达梦数据库】异构数据库迁移到达梦

目录

  • 1、迁移准备
  • 2、正式迁移
  • 3、问题处理
    • 3.1、return附近出现错误
      • 3.1.1、排查过程
      • 3.1.2、问题原因
      • 3.1.2、解决方法
    • 3.2、对象[XXX]处于无效状态-类型1
      • 3.2.1、排查过程
      • 3.2.2、问题原因
      • 3.2.3、解决方法
    • 3.3、对象[XXX]处于无效状态-类型2
      • 3.3.1、排查过程
      • 3.3.2、问题原因
      • 3.3.3、解决方法
    • 3.4、违反引用约束[XXX]
    • 3.5、Java heap space
    • 3.6、记录超长
    • 3.7、数据未找到
      • 3.7.1、问题原因
      • 3.7.2、解决方法

因为数据迁移涉及到很多东西,最主要的还是参考官方给出的文档:https://eco.dameng.com/document/dm/zh-cn/start/oracle_dm.html。
以下是根据项目经验做的一些总结:

1、迁移准备

迁移统计

--------------------------------迁移对象统计-----------------------------------------用户		表数量	索引数量	分区表数量	包含LOB表数量	LOB占用空间		视图数量		触发器数量	函数数量	序列数量	同义词	物化视图数量	存储过程数量	DBLINK数量	最大单字段宽度	最大行宽度
1	ECOLOGY	8998	17317	0			3454			127.173828125	128			7041		76		7095	0		1			2152		1			4000			64222762
----------------------------------数据量---------------------------------------SEGMENT_TYPE	SUM(BYTES)/1024/1024/1024	COUNT(*)
1	TABLE			246.661682128906			5079
2	LOBSEGMENT		127.174194335938			2666
3	INDEX			68.050048828125				8464
4	LOBINDEX		0.1627197265625				2666

初始化达梦数据库

1、簇页大小:32
2、字符集:UTF-8
3、大小写是否敏感:是

创建和源库一样的用户,指定默认表空间

---------------------------------创建表空间---------------------------------------
create tablespace "ECOLOGY" datafile '/opt/dmdata/DAMENG/ECOLOGY.DBF' size 128 CACHE = NORMAL;
----------------------------------创建用户---------------------------------------
create user "ecology" identified by "Abc12345678" default tablespace "ECOLOGY";
----------------------------------授权---------------------------------------
grant "DBA","PUBLIC","RESOURCE","SOI","SVI","VTI" to "ECOLOGY";

2、正式迁移

迁移原则:

--数据量大的用户分开迁移
--1、对象定义迁移
------1.1【表】、【序列】、【同义词】、【自定义类型】的[对象定义]迁移
------1.2【存储过程】、【函数】、【包】、【触发器】迁移
------1.3【视图】、【物化视图】迁移
--2、表数据迁移
--3、约束索引迁移

3、问题处理

3.1、return附近出现错误

迁移报错,查看原因:return附近出现错误。

3.1.1、排查过程

DTS工具找到目的库源SQL:

CREATE OR REPLACE 
PROCEDURE "ECOLOGY"."LGCASSETSTOCK_EDITORVIEW" ( assetid_3     integer, warehouseid_2 integer, flag out integer , msg out varchar2, thecursor IN OUT cursor_define.weavercursor) 
AS count_1 integer; 
begin select count(*) into count_1 from LgcStockInOut a, LgcStockInOutDetail b where a.warehouseid=warehouseid_2 and b.assetid=assetid_3 and a.id=b.inoutid and a.stockmodeid<>-2; if count_1>0 then open thecursor for select -1 from dual; return; else open thecursor for select 1 from dual return; end if; 
end;2、重新执行报错:return附近出现错误

3.1.2、问题原因

SQL【select 1 from dual return;】dual后面缺少分号,

3.1.2、解决方法

改写SQL后重新执行即可

CREATE OR REPLACE 
PROCEDURE "ECOLOGY"."LGCASSETSTOCK_EDITORVIEW" ( assetid_3     integer,warehouseid_2 integer,flag out integer ,msg out varchar2,thecursor IN OUT cursor_define.weavercursor)
AS count_1 integer;
beginselect count(*) into count_1 from LgcStockInOut a, LgcStockInOutDetail bwhere a.warehouseid=warehouseid_2and b.assetid=assetid_3and a.id=b.inoutidand a.stockmodeid<>-2;if count_1>0 then open thecursor for select -1 from dual;return;else open thecursor for select 1 from dual;return;end if;
end;

3.2、对象[XXX]处于无效状态-类型1

迁移报错,查看原因:对象[COWORK_APPLY_INFO_ID_TRIGGER]处于无效状态

3.2.1、排查过程

1、查看源库触发器状态,有效
Select * From dba_triggers WHERE TRIGGER_NAME = 'COWORKBASESET_TRIGGER'; 
2、通过管理工具查看目的库触发器状态,无效,且编译错误。
3、找到目的库源SQL
CREATE OR REPLACE TRIGGER "ECOLOGY"."COWORKBASESET_TRIGGER"
before insert on "ECOLOGY"."COWORK_BASE_SET" 
for each row
begin select coworkbaseset_seq.nextval into:new.id from sys.dual; end;
4、重新执行报错:无效的表或视图名[DUAL]

3.2.2、问题原因

达梦数据库不支持sys.dual的写法

3.2.3、解决方法

改写SQL:sys.dual改成dual,重新执行即可

CREATE OR REPLACE TRIGGER "ECOLOGY"."COWORKBASESET_TRIGGER"
before insert on "ECOLOGY"."COWORK_BASE_SET" 
for each row
begin select coworkbaseset_seq.nextval into:new.id from dual; end;

3.3、对象[XXX]处于无效状态-类型2

迁移报错,查看原因:对象[WORKFLOW_BASE_GETPINYIN]处于无效状态

3.3.1、排查过程

1、查看源库对象[WORKFLOW_BASE_GETPINYIN]状态,有效
Select * From dba_triggers WHERE TRIGGER_NAME = 'WORKFLOW_BASE_GETPINYIN'; 
2、通过管理工具查看目的库对象[WORKFLOW_BASE_GETPINYIN]状态,无效且编译错误,
3、重新编译,错误消息: 对象[GETPINYIN]处于无效状态
4、查看源库对象[GETPINYIN]状态,有效
SELECT * FROM dba_objects WHERE object_type='FUNCTION' and object_name='GETPINYIN' 
5、通过管理工具查看目的库对象[GETPINYIN]状态,无效且编译错误,
6、重新编译,错误消息: 无法解析的成员访问表达式[USERENV]

3.3.2、问题原因

达梦数据库不支持USERENV(‘LANGUAGE’)的写法

3.3.3、解决方法

1、改写SQL:SYS_CONTEXT('USERENV','LANGUAGE')代替USERENV('LANGUAGE')2、重新执行SQL成功,对象[GETPINYIN]状态有效
3、重新编译对象[WORKFLOW_BASE_GETPINYIN]

3.4、违反引用约束[XXX]

参考链接: 违反引用约束

3.5、Java heap space

参考链接: Java heap space

3.6、记录超长

参考链接: 记录超长

3.7、数据未找到

迁移报错,查看原因:数据未找到

3.7.1、问题原因

1、先迁移约束索引,后迁移数据、会出现这样的问题
2、DTS版本问题。

3.7.2、解决方法

1、按照顺序重新迁移对象。
2、换个DTS新版本

http://www.lryc.cn/news/436007.html

相关文章:

  • 抽象类和接口(1)
  • epoll内核原理与实现详解
  • 被低估的SQL
  • 数字证书、数字签名及其关系
  • 一文读懂:如何将广告融入大型语言模型(LLM)输出
  • godotenv拜读
  • 解析REST API与OpenAPI之差异:避免混淆
  • 一篇文章就搞懂了:过虑器 、拦截器 、监听器是什么
  • 本体映射与本体集成
  • 华媒舍:10种提升推特大V发文推广曝光率的方式
  • 前端本地存储数据:深入解析与代码示例(Cookie、LocalStorage、SessionStorage和IndexedDB)
  • Java语言程序设计基础篇_编程练习题*18.21 (将十进制数转换为二进制数)
  • 中年转行新可能:18 个月迈向大模型提示词工程师
  • C++通过返回值和输出参数的原理是什么?分别有什么优势和缺点?
  • AI客服机器人开启企业客户服务新纪元
  • TPM项目课题的确定需要考虑哪些因素?
  • Rust 数据类型
  • C#无标题栏窗体拖动
  • MySQL容器配置连接数数,镜像重启生效
  • 《OpenCV计算机视觉》—— 身份证号码识别案例
  • 如何使用正则表达式替换字符串中的特定位置数字
  • 【SQL】在SQL中,行转列
  • 95. UE5 GAS RPG 实现创建多段飞弹攻击敌人
  • 分布式集群下如何做到唯一序列号
  • 在 Vue 2 中使用 Axios 发起 POST 和 GET 请求
  • Linux内核初始化过程中加载TCP/IP协议栈
  • Mysql树形结构表-查询所有子集数据
  • Vue 3 Composition API进阶指南
  • C++学习,多继承
  • 苹果研究人员提出了一种新颖的AI算法来优化字节级表示以自动语音识别(ASR),并将其与UTF-8表示进行比较