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

因为数据迁移涉及到很多东西,最主要的还是参考官方给出的文档: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;
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;

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、记录超长

参考链接: 记录超长
对这个表启用超长列,SQL 命令如下:

alter table Workflow_track enable using long row;

重新迁移表即可成功。

3.7、数据未找到

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

3.7.1、问题原因

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

3.7.2、解决方法

1、按照顺序重新迁移对象-(推荐)
2、换个DTS新版本

3.8、违反引用约束

参考链接1: 违反引用约束

参考链接2: 违反唯一约束
方法3:多试几次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值