转://执行impdp时出现ORA-39154错误的解决案例
问题描述
如下导出过程正常:
expdp \"/ as sysdba\" tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
导入过程中出现ORA-39154错误,提示导入的内容里包含有不属于user_a用户的对象,这部分对象没有能够正常导入,但user_a.t表已经导入成功了
revoke imp_full_database from user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
ORA-39154: Objects from foreign schemas have been removed from import
出错原因分析:
因为导入内容里包括了统计信息,统计信息的相关操作在导入的过程中是在sys.impdp_stats表里进行的(可从impdp生成的sql脚本看出来),user_a用户需赋予imp_full_database权限才能导入这部分统计信息,这应该就是ORA-39154的成因
赋给user_a用户imp_full_database权限后再次进行impdp,ORA-39083取代了ORA-39154,问题出现在为user_b.IDX1_T1,user_b.IDX1_T2这两个索引生成统计信息时发现索引不存在,即索引和表不在同一个schema,表在user_a用户下,索引却建在user_b用户下。
grant imp_full_database to user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
ORA-39083: Object type INDEX_STATISTICS failed to create with error:
ORA-20000: INDEX "USER_B"."IDX1_T1" does not exist or insufficient privileges
ORA-20000: INDEX "USER_B"."IDX1_T2" does not exist or insufficient privileges
检查发现:目标库检查只有表被导入,索引并没有导入
验证:是否因为user_a是普通用户没有权限在user_b下创建索引,使用sysdba再次执行impdp,报错依旧:
impdp \"/ as sysdba\" directory=mydir dumpfile=t.dmp logfile=imp_t.log
使用sysdba用户导入也出现同样错误,应该不是权限问题,报错信息出现在导入索引统计信息阶段,因为user_b用户下的两个索引不存在导致ORA-39083,难道是导出的dmp文件压根就没包含这两个索引的信息,将impdp内容重定向到脚本,检查内容发现除了建表与导入索引的统计信息外,确实没有创建这两个索引的DDL语句。
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log sqlfile=t.sql
解决方案:expdp阶段user_b用户下的索引也带上
######Schemas必须带上user_a,user_b这两个用户,如果Schema不指定那么默认在SYS下去找
expdp \"/ as sysdba\" schemas=user_a,user_b include=TABLE:\"=\'T\'\",INDEX:\"IN \(\'IDX1_T\',\'IDX2_T\'\)\" directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
注:上述导出操作如果为普通用户,则需授予该用户exp_full_database权限,否则将触发如下错误
ORA-39165: Schema user_b was not found.
ORA-39168: Object path INDEX was not found.
#####导入目标库之前先将impdp内容重定向到sql脚本,发现已包含create index的步骤
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log sqlfile=t.sql
#####导入成功,表与索引都导入了
grant imp_full_database to user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
总结:本例中导致ORA-39154的根本问题在于user_a用的表上的索引没建在user_a用户下,这样的情况称为cross schema references,即不同schema的对象间存在关联,cross schema references导致的impdp错误还是比较隐蔽的,好在我们使用了sysdba权限从源库expdp导出表,然后通过impdp时有关统计信息无法导入的ORA-39154错误,一步一步追溯直至发现索引和表不在同一个schema下,问题才得以精确定位。此案例说明table mode export方式,如果依赖于a.tb表的对象,比如基于a.tb的索引ind_b,建在b用户下,则如下命令在导出结果里不会包含b用户下的索引
expdp user/passwd tables=a.tb directory=dirname dumpfile=a.tb.dmp logfile=exp_a.tb.dmp
必须使用schemas、include参数精确指定表名和索引名称,例如:
expdp user/passwd schemas=a,b include=TABLE:\"=\'TB\'\",INDEX:\"IN \(\'IND_B\'\)\" directory=dirname dumpfile=a.tb.dmp logfile=exp_a.tb.dmp
顺便提下,如果一开始从源库导出表时没有像下面这样使用sysdba权限
expdp \"/ as sysdba\" tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
而是像下面这样使用ad用户
expdp user_a/passwd tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
那么impdp目标库是不会有任何报错的,后果很严重的,将导致目标库上的表应该有索引的字段却没有建索引。
转://执行impdp时出现ORA-39154错误的解决案例的更多相关文章
- 执行impdp时出现的各种问题
1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...
- 执行impdp时ORA-39213: Metadata processing is not available错误处理
通过impdp命令将Oracle11g数据库的dmp文件导入至Oracle10g中时,报出如下错误: [oracle@dbsrv3 ~]$ impdp dhccms/dhccms DIRECTORY= ...
- MVC.Net:对MVC5部署时出现403.14错误的解决方法
当我们部署MVC5到IIS 7的时候,有时会出现403.14的错误,如下图: 对于这个错误的解决方法就是在应用程序的web.config的system.webServer节点中加入这一句: <m ...
- 关于oracle 11g导出数据时 报 ORA 1455错误的处理
因为导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先: 查看: SQL>show parameter deferred_segment_creation; 假设为T ...
- ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法
偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...
- 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)
1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...
- [Win10]安装msi时2503,2502错误及其解决
简述 刚安装了win10系统,在安装TortoiseGit和TortoiseSvn时,这两个软件是.msi后缀的安装文件,在点击安装时老是提示2503,2502错误,因此无法安装上 搜索了下一般都提到 ...
- 初始化mysql数据库时提示字符编码错误的解决办法
有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...
- 使用VS2015编写驱动时出现的部分错误以及解决方法
前几日在github上下载了一个Windows驱动的demo,原本想着直接下载下来打开解决方案就可以用,没想到一编译,出现了奇奇怪怪的Error,部分Error网上也没什么好的解决办法,对我这个从未深 ...
随机推荐
- [译]WebAPI下的如何实现参数绑定
本文将概述在WebAPI方式下将如何将参数绑定到一个action方法,包括参数是如何被读取,一系列规则决定特定环境采用的那种绑定方式,文章最后将给出一些实际的例子. Parameter binding ...
- MSSQL存储过程应用
1.原始表inoutinfo 2.现在想输入时间范围和操作类型输出对应的结果 2.1创建存储过程 create proc selecttype@type nvarchar(10),@starttime ...
- 还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:
还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积.表 ...
- ASP.NET Identity系列教程(目录)转载
来源:http://www.cnblogs.com/r01cn/p/5179506.html 注:最近看到不少介绍微软ASP.NET Identity技术的文章,但感觉都不够完整深入,本人又恰好曾在A ...
- java中import static和import的区别【转】
转自:http://blog.csdn.net/ygc87/article/details/7371254
- JPA与EJB3的关系
JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称 ...
- SSM+solr 通过商品搜索学习solr的简单使用
学习了一下https://github.com/TyCoding/ssm-redis-solr这个github上的solr搜索功能,现在来记录一下. 我的理解就是solr有点类似于数据库,但它是有索引 ...
- Matlab 输入特殊字符
下标用 _(下划线) 希腊字母等特殊字符用 \加拼音 如 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Gamma δ \delta ...
- Spring全家桶系列–SpringBoot之入门JPA
//本文作者:cuifuan 什么是JPA? 一种规范,并非ORM框架,也就是ORM上统一的规范 用了之后可以做什么,为什么要用? 代码解释: 实体类 package com.example.spri ...
- Django Rest framework 之 版本
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...