问题描述
如下导出过程正常:
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错误的解决案例的更多相关文章

  1. 执行impdp时出现的各种问题

    1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...

  2. 执行impdp时ORA-39213: Metadata processing is not available错误处理

    通过impdp命令将Oracle11g数据库的dmp文件导入至Oracle10g中时,报出如下错误: [oracle@dbsrv3 ~]$ impdp dhccms/dhccms DIRECTORY= ...

  3. MVC.Net:对MVC5部署时出现403.14错误的解决方法

    当我们部署MVC5到IIS 7的时候,有时会出现403.14的错误,如下图: 对于这个错误的解决方法就是在应用程序的web.config的system.webServer节点中加入这一句: <m ...

  4. 关于oracle 11g导出数据时 报 ORA 1455错误的处理

    因为导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先:  查看:     SQL>show parameter deferred_segment_creation;  假设为T ...

  5. ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

    偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...

  6. 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)

    1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...

  7. [Win10]安装msi时2503,2502错误及其解决

    简述 刚安装了win10系统,在安装TortoiseGit和TortoiseSvn时,这两个软件是.msi后缀的安装文件,在点击安装时老是提示2503,2502错误,因此无法安装上 搜索了下一般都提到 ...

  8. 初始化mysql数据库时提示字符编码错误的解决办法

    有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...

  9. 使用VS2015编写驱动时出现的部分错误以及解决方法

    前几日在github上下载了一个Windows驱动的demo,原本想着直接下载下来打开解决方案就可以用,没想到一编译,出现了奇奇怪怪的Error,部分Error网上也没什么好的解决办法,对我这个从未深 ...

随机推荐

  1. Struts2之ValueStack、ActionContext

    今天在看Action获取Resquest.Response时,发现了一个词:值栈.于是今天一天都在看,了解了值栈不仅能知道Action怎么获取request.response等这些,还会了解OGNL语 ...

  2. 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  3. [转]window7下利用DockerToolbox安装Docker

    本文转自:https://blog.csdn.net/qq2712193/article/details/54576313 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  4. es6中的部分新特性

    1.es6中变量声明可以使用let声明变量,用const声明常量.例: test:function(){ { var num=10; let num1=11; const num2=12; } con ...

  5. 左连接,右连接,内连接(left join ,right join,inner join)

    浅谈左连接,右连接,内连接(left join ,right join,inner join) 这个问题一直困扰着我,每次遇到就打擦边球,不正面应对.今天索性把这几个连接搞懂了,写下这篇博客, 让跟我 ...

  6. 移动端地区选择控件mobile-select-area

    由于之前的[js开源组件开发]js手机联动选择地区仿ios 开源git 很受欢迎,于是我又对其进行了一些优化,包括可选的范围变大了,添加了默认空首地址的功能,也添加了更多api参数,首先我们先来看下这 ...

  7. php编程规范整理

    该规范对其他语言,部分是通用的标准....好吧,废话不多说啦,直入正题: 1.PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 function 函数体说明 3 代码缩进 4 if省略 ...

  8. JavaSE 常用类与其方法

    1.基本数据类型比较用:== 2.引用数据类型比较用:equals方法 如果引用数据类型使用==比较的话,比较的是地址值 toString类 对象调用toString()需要重写本方法: 在封装类中, ...

  9. groovy使用范型的坑

    java的范型 Map<String, Integer> map = new HashMap<>(); map.put("a", 100); map.put ...

  10. minitab 输入一串数字

    有时候,我们要向minitab的worksheet输入一串串的数字,很是麻烦. 相如一串数字我们在一个pdf文件存着 那么效率最低的输入方法就是一个一个的输入,"Enter"进入下 ...