问题描述
如下导出过程正常:
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. spring cloud config客户端

    上篇介绍了spring cloud config服务器,本篇介绍客户端.客户端主要是从config服务器获取配置信息. 代码示例 首先创建一个Maven项目,在pom.xml文件中添加依赖: < ...

  2. [PHP]算法- 判断是否为二叉搜索树的后序遍历序列的PHP实现

    二叉搜索树的后序遍历序列: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 1.后序遍历是 左右中 ...

  3. 如何判断页面是pc端还是移动端,进入不同的页面

    vue判断是pc端还是移动端分别进入不同的页面 判断移动端代码如下: function IsPC(){ var userAgentInfo = navigator.userAgent; var Age ...

  4. spring boot (1):初尝

    工具:intellij idea 自定义banner: 控制台console显示的banner 自定义方式,在src/main/resources 下创建banner.txt增加文本即可,生成字符网站 ...

  5. CDQ分治小结

    CDQ分治小结 warning:此文仅用博主复习使用,初学者看的话后果自负.. 复习的时候才发现以前根本就没写过这种东西的总结,简单的扯一扯 cdq分治的经典应用就是解决偏序问题 比如最经典的三维偏序 ...

  6. 函数节流scroll,兼容火狐滚轮事件

    //函数节流 var wheelTimeout; var wheelFun = function (func) { if (wheelTimeout) { return; } func(); whee ...

  7. 方差variance, 协方差covariance, 协方差矩阵covariance matrix

    https://www.jianshu.com/p/e1c8270477bc?utm_campaign=maleskine&utm_content=note&utm_medium=se ...

  8. Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题

    解决Python安装包时提示Unable to find vcvarsall.bat的问题   by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...

  9. Application.Current的使用

    来源 http://www.cnblogs.com/symons/archive/2010/03/15/1686200.html Application.Current的使用 WPF程序对应一个App ...

  10. 第一个Django页面(2)

    第一个Django页面 1,进入forum项目:熟悉项目里各种文件的作用 2,配置URL:在urls.py里面添加 [url路径与对应的处理函数] 3,编写处理函数:根据urls.py里添加函数的路径 ...