首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【异常处理】几个Datapump迁移的异常处理(LOB、index数量差异等)

【异常处理】几个Datapump迁移的异常处理(LOB、index数量差异等)

作者头像
甚至熊熊
发布于 2021-04-22 09:21:05
发布于 2021-04-22 09:21:05
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

在做一套库的迁移准备,测试的时候有些异常,记录一下处理办法。 如果有处理不对的地方,请不吝赐教。

1.dba_objects表对比发现LOB对象数量差距大

数据泵迁移完对比对象数量,发现LOB对象差距很大。

目标库执行查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--查询目标库数据
select object_type, count(*) as num
  from dba_objects
 where owner = 'LC'
 group by object_type

--查询源库数据,通过dblink
select object_type, count(*) as num
  from dba_objects@qy
 where owner = 'LC'
 group by object_type

查询结果,相差1070个LOB对象:

由于只是迁移测试,并没有停业务,所以首先想到的是不是在迁移完成到对比数据之间的时间之间,创建了大量的LOB对象呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--目标库执行查询
select object_type, object_name, status, created
  from dba_objects@qy
 where object_type = 'LOB'
 order by CREATED desc;

查询结果,没有新创建LOB:

对象的状态(VALID/INVALID)并不会影响导入,这点不需要验证。

到这里就没思路了,有大佬提示查询mos,在1595391.1中找到答案: 含有lob字段的表drop掉之后,lob字段实际并没有purged,而是放在回收站中。这种情况下,查询dba_object(包含user_object和obj)仍然能看到删掉的lob对象。准确的对比方式应该是查询user_lobs表。

我们分别查询user_lobs表跟user_recyclebin表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(*) from user_lobs;
select count(*) from user_lobs@qy;

user_lobs的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select count(*) from user_recyclebin@qy where type='LOB';

源库user_recyclebin的结果:

最后:

  1. 源库回收站中1070+user_lobs中360=1430,这样就跟dba_objects表的数量对起来了,所以这部分忽略即可
  2. obj表是user_objects视图的同义词
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--dba_objects表中查看obj的类型
select * from dba_objects where object_name='OBJ';

--查看同义词创建语句
select dbms_metadata.get_ddl('SYNONYM','OBJ','PUBLIC') from dual;

--查询结果
CREATE OR REPLACE PUBLIC SYNONYM "OBJ" FOR "SYS"."USER_OBJECTS"
  1. dba_lobs=all_lobs,官方文档说明

DBA_LOBS displays the BLOBs and CLOBs contained in all tables in the database. BFILEs are stored outside the database, so they are not described by this view. This view’s columns are the same as those in ALL_LOBS.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/ALL_LOBS.html#GUID-EA28B5D0-3C72-4D7A-9151-AD96A132FDE5

2.源库有5条索引没有导入目标库

导入完成对比数据发现差了5条索引,但是导入日志并没有报错,排查的思路是

  1. 先查看日志是否有错误抛出
  2. 找出差异的是哪几条索引
  3. 检查索引的ddl语句、依赖的表等信息

首先检查日志未发现报错

通过minus方式对比dba_indexes表找出具体索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--migrate_username是源库创建的待迁移用户表,在XTTS迁移那篇里有建表语句
--SYS_C开头的索引是主键索引,DBA_CONSTRAINTS表里可以确认到
--SYS_IL开头的索引是LOB字段自动创建的索引

SELECT owner, index_name, INDEX_TYPE
  FROM dba_indexes@qy
 WHERE     OWNER IN (SELECT username FROM SYSTEM.migrate_username@qy)
       AND index_name NOT LIKE 'SYS_C%'
       AND index_name NOT LIKE 'SYS_IL%'
MINUS
SELECT owner, index_name, INDEX_TYPE
  FROM dba_indexes
 WHERE OWNER IN (SELECT username FROM SYSTEM.migrate_username@qy)
ORDER BY owner, index_name;

查询结果:

随便找一条,看看创建语句;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> set long 9999
SQL> select dbms_metadata.get_ddl('INDEX','PBXXXX_X','LC') from dual;

查询结果:

可以看出索引是LC用户的对象,但是依赖的表在SYSTEM用户下。这次迁移impdp指定的schema=LC,没有包含索引所依赖的表,判断大概率因为没有表所以索引也就没有导入。又产生了新的问题,既然没有表,那为什么导入的时候没有报错呢?下面通过实验验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> conn test/test
Connected.
SQL> 
SQL> 
SQL> create table t2(c1 number);

Table created.

SQL> insert into t2 values(98888888);

1 row created.

SQL> commit ;

Commit complete.

SQL> grant select,index on t2 to scott;

Grant succeeded.

SQL> conn scott/tiger
Connected.
SQL> create index i_2 on test.t2(c1);

Index created.

SQL> 
SQL> exit

[oracle@leadx ~]$ expdp \'/ as sysdba \' directory=data_pump_dir schemas=scott dumpfile=exp1.dmp

Export: Release 11.2.0.4.0 - Production on Tue Mar 9 23:51:35 2021

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  "/******** AS SYSDBA" directory=data_pump_dir schemas=scott dumpfile=exp1.dmp 
Estimate in progress using BLOCKS method...
Total estimation using BLOCKS method: 0 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************

实验结论:表在LC用户下,索引在SYSTEM用户下,使用数据泵导出指定schema=LC,则并不会将A用户下的对应索引导出,所以导入的时候也就不会报错。 索引是属于表的,表是system下的,导出的是lc用户,就不会导出那个索引,索引不能单独存在。

最后咨询业务开发方,这几个表非业务表,忽略即可。

3.ORA-31679 表中含有long类型的列处理

ORA-31679: Table data object “LC”.“XXXXXXXXIN_229X68” has long columns, and longs can not be loaded/unloaded using a network link

意思就是含有long类型列的表,不能通过network_link方式直接导入。 查询官方文档:DataPump Import Of Tables Containing LONG Columns Using NETWORK_LINK Raises The Error ORA-31679 (Doc ID 1470331.1)

解决办法:

  1. 按照mos说的,单独导出这个表为dmp文件,再单独导入一次;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--源库
expdp \"/ as sysdba\" directory=dmp_dir dumpfile=single_table.dmp logfile=single_table.log tables=LC.XXXXXXX_229568;

--目标库
impdp \"/ as sysdba\" directory=dmp_dir dumpfile=single_table.dmp logfile=imp_single.log tables=LC.XXXXXXX_229568 remap_schema=LC:LC;

按照上述操作后,可在目标库正常查询数据

  1. 网上查到的有说可以用exp/imp;

4. ORA-31693、ORA-01400

ORA-31693: Table data object “LC”.“XXXXXXXXXH_201X0808” failed to load/unload and is being skipped due to error: ORA-01400: cannot insert NULL into (“LC”.“XXXXXXXXXH_201X0808”.“BASE_TYPE”)

查了一下"XXXXXXXXXH_201X0808"表的"BASE_TYPE"列约束为not null,查询该列内容确实有为“空”的情况,但是很奇怪条件语句用 is null 或者是=’ '又搜不出,跟客户确认过为备份表可忽略后没在继续确认(这个习惯不好,遇到问题应该查到底)

5.若干compilation warnings(编译警告)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORA-39082: Object type ALTER_FUNCTION:"LC"."SXXXT" created with compilation warnings
ORA-39082: Object type VIEW:"LC"."WH_XXXXXXXXXXTORY" created with compilation warnings
ORA-39082: Object type TRIGGER:"LC"."GXXXXXXXXXESS_SEQ" created with compilation warnings

编译告警一般是这些对象在源库就已经是INVALID状态了,可以到dba_objects视图确认下

一般迁移完成需要重新编译,执行下方编译脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@?/rdbms/admin/utlrp

6.ORA-04052、ORA-00604、ORA-02019

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORA-04052: error occurred when looking up remote object RESECH.VI_SCXXXXXLECT@EM
ORA-00604: error occurred at recursive SQL level 3
ORA-02019: connection description for remote database not found

明显是找不到远程对象,查询源库的dba_db_links表并没有发现名为EM的dblink,忽略

7.总结

对这篇的补充 https://www.modb.pro/db/38130

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Entity Framework 自动生成CodeFirst代码
在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发。今天就让我们一起看一下使用Entity Framework Power Tools如何基于现有数据库生成数据类和数据库上下等。
aehyok
2018/09/11
8770
Entity Framework 自动生成CodeFirst代码
Entity Framework ModelFirst尝试
Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在Visual Studio中我们通过设计对于的数据模型来生成数据库和数据类。
aehyok
2018/09/11
5940
Entity Framework ModelFirst尝试
Entity Framework CodeFirst数据迁移
我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能。
aehyok
2018/09/11
9670
Entity Framework  CodeFirst数据迁移
.NET:Entity Framework 笔记
有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EFSample.Model { [Table("T_ORDER")]
菩提树下的杨过
2018/01/19
1.1K0
Entity Framework 简单查询
第一步还是先建立一个控制台的应用程序,然后通过Nuget添加Entity Framework。那么同时会给packages.config和App.config添加相应的配置。
aehyok
2018/09/11
9050
Entity Framework 简单查询
Entity Framework 关系约束配置
简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在设计表的时候预先设计好的,通过主外键进行关联。那么现在在Entity Framework中是如何配置处理的呢?
aehyok
2018/09/11
6780
使用CodeFirst创建并更新数据库
在使用Entity Framwork的三种方式(ModelFist、DBFirst、CodeFirst)中,CodeFirst方式书写的代码最为干净。
雪飞鸿
2018/09/05
2.9K0
使用CodeFirst创建并更新数据库
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
1.1K0
.NET EF Core(Entity Framework Core)
Entity Framework 简单增删改操作
 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加、删除、修改操作。
aehyok
2018/09/11
8760
Entity Framework 简单增删改操作
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完全,其中修改是无法直接使用的需要做一些处理 3.EntityFramework.Extended如何跟EntityFramework其他的操作在一个事物里面(针对网友zengfanlin 问题) 解决方案 1.首先解决第一个问题 准备条件:用Nuget下载Mysql.Data.Entity(可以将依赖连同下载)
逸鹏
2018/04/11
1.8K0
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended
EntityFramework使用总结(与MVC4.0实现CURD操作)
本篇文介绍一下Entity Framework Code First的简单用法,通过一个学生信息的增删查改来学习Entity Framework的使用及与存储过程的交互。我也是学习Entity Framework新手,有说的不对地方欢迎指正。
写代码的猿
2019/04/11
9510
EntityFramework使用总结(与MVC4.0实现CURD操作)
Oracle中使用Entity Framework 6.x Code-First方式开发
去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using NuGet to Install and Configure Oracle Data Provider for .NET 2.Entity Framework Code First and Code First Migrations for Oracle Database 基本上照着做就行了,为了方便不愿意啃英
菩提树下的杨过
2018/01/19
1.5K0
Oracle中使用Entity Framework 6.x Code-First方式开发
Entity Framework 数据访问浅谈
在现代的软件开发中,数据库操作是必不可少的一部分。无论是简单的数据读取还是复杂的事务处理,都需要与数据库进行交互。在这个过程中,Entity Framework (EF) 作为 .NET 平台上的一款优秀 ORM(对象关系映射)框架,提供了强大的功能来简化数据库操作。本文将带你快速了解 EF 的基本用法,并探讨一些常见的问题以及如何避免这些错误。
Jimaks
2024/10/19
2290
Entity Framework 数据访问浅谈
Entity Framework Repository模式
如果我们用最原始的EF进行设计对每个实体类的“C(增加)、R(读取)、U(修改)、D(删除)”这四个操作。
aehyok
2018/09/11
1.2K0
Entity Framework Repository模式
Entity Framework DBFirst尝试
“Database First”模式我们称之为“数据库优先”,前提是你的应用已经有相应的数据库,你可以使用EF设计工具根据数据库生成数据数据类,你可以使用Visual Studio模型设计器修改这些模型之间对应关系。
aehyok
2018/09/11
6090
Entity Framework DBFirst尝试
entity framework数据库映射(ORM)
Sql Server安装:EntityFramework Mysql安装:MySql.Data.Entity
sofu456
2022/05/06
1.1K0
entity framework数据库映射(ORM)
Entity Framework初体验
4.创建一个继承自EF上下文的类,此上下文是与数据库交互的一个中间桥梁,我们可以称之为会话,并且为每一个模型公开一个DbSet:
喵叔
2020/09/08
5500
Entity Framework初体验
Entity Framework 系统约定配置
Code First之所以能够让开发人员以一种更加高效、灵活的方式进行数据操作有一个重要的原因在于它的约定配置。现在软件开发越来越复杂,大家都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定。对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计。使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有。在EF中是以一种约定的方式进行表、列同实体类进行映射的,与此同时为了提高最大的灵活性EF中可以通过Fluent API和Data Annotations两种方式对映射进行灵活配置。
aehyok
2018/09/11
9830
面向初学者的 Entity Framework Core
实体框架核心(Entity Framework Core,简称EF Core)是一款适用于.NET应用程序的开源、轻量级且跨平台的对象关系映射器(Object-Relational Mapper,简称ORM)。它允许开发人员使用.NET对象来操作数据库,从而无需编写大多数SQL查询语句。EF Core通过对数据库交互的复杂性进行抽象,使得数据访问代码更易于维护、扩展和测试。
郑子铭
2025/02/18
4420
面向初学者的 Entity Framework Core
Entity Framework三大开发模式详解
Entity Framework(EF)是.NET平台下的一种对象关系映射(ORM)框架,它简化了与数据库的交互,使开发人员能够以面向对象的方式来操作数据库。在Entity Framework中,有三种主要的开发模式:Database First、Model First和Code First。本文将深入探讨这三种开发模式,通过生动的语言和丰富的示例代码,让小白也能轻松理解。
繁依Fanyi
2024/01/25
6421
相关推荐
Entity Framework 自动生成CodeFirst代码
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.dba_objects表对比发现LOB对象数量差距大
  • 2.源库有5条索引没有导入目标库
  • 3.ORA-31679 表中含有long类型的列处理
  • 4. ORA-31693、ORA-01400
  • 5.若干compilation warnings(编译警告)
  • 6.ORA-04052、ORA-00604、ORA-02019
  • 7.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档